Thymeleaf语法:" @ {/}"如果我包含ResourceUrlEncodingFilter,则返回空

时间:2015-07-02 10:36:31

标签: spring-mvc thymeleaf

我使用的是Thymeleaf。

此模板:

<a th:href="@{/}">a</a>

产生这个html:

<a href="/">a</a>

这就是我所期待的。

我把ResourceUrlEncodingFilter bean放在我的WebMvcConfigurerAdapter扩展类中尝试ContentVersionStrategy。

@Bean
public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
    return new ResourceUrlEncodingFilter();
}

制作的html转向:

<a href="">a</a>

href的值为空。 我希望href是&#34; /&#34;即使我把ResourceUrlEncodingFilter bean。 在这两种情况下,th:href="@{/a}"都会转为href="/a"

我做错了吗?

非常感谢。

更新:

这是我的build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'io.spring.gradle:dependency-management-plugin:0.5.1.RELEASE'
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.3.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'spring-boot'
apply plugin: 'io.spring.dependency-management'

version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

dependencyManagement {
    imports {
        mavenBom 'io.spring.platform:platform-bom:1.1.2.RELEASE'
    }
}

dependencies {
    compile('org.webjars:bootstrap:3.3.1')
    compile('org.webjars:knockout:3.2.0')
    compile('org.webjars:momentjs:2.9.0')
    compile('org.webjars:numeral-js:1.5.3-1')
    compile('org.webjars:underscorejs:1.7.0-1')
    compile('org.webjars:sugar:1.4.1')
    compile('org.webjars:jqplot:1.0.8r1250')
    compile('org.webjars:jquery-cookie:1.4.1-1')

    compile("org.springframework.boot:spring-boot-starter-actuator")
    compile("org.springframework.boot:spring-boot-starter-batch")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-tomcat")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-test")
    compile("org.springframework:spring-context-support")               //  this is for mail

    compile('commons-codec:commons-codec')
    compile("commons-io:commons-io")
    compile('com.google.guava:guava')
    compile('org.hibernate:hibernate-validator')
    compile("com.sun.mail:javax.mail")
    compile('mysql:mysql-connector-java')
    compile("org.yaml:snakeyaml")

    compile("org.apache.commons:commons-lang3:3.2")
    compile('com.amazonaws:aws-java-sdk:1.9.4')
    compile('net.sf.supercsv:super-csv:2.2.0')
    compile('edu.vt.middleware:vt-password:3.1.2')
}

test {
    //systemProperties 'property': 'value'
    systemProperties 'spring.profiles.active':  'unittest'
    systemProperties 'MAIL_PROP':               'mail.properties'
    systemProperties 'user.timezone':           'UTC'
}

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

2 个答案:

答案 0 :(得分:0)

Spring Boot添加&#34; / **&#34;用于自动配置静态Web资源位置的匹配器。 位置是/ META-INF / resources /,/ resources /,/ static /和/ public /.

当您将以下html放在Thymeleaf模板中时,

<a th:href="@{/}">a</a>

由于匹配器而调用ResourceUrlProvider.java中的方法,并进入for循环:

public final String getForLookupPath(String lookupPath) {
        // -- omission --
        for(String pattern : matchingPatterns) {
            // -- omission --
            String pathWithinMapping = getPathMatcher().extractPathWithinPattern(pattern, lookupPath);
            String pathMapping = lookupPath.substring(0, lookupPath.indexOf(pathWithinMapping));
            // -- omission --
            String resolved = chain.resolveUrlPath(pathWithinMapping, handler.getLocations());
            if (resolved == null) {
                continue;
            }
            // -- omission --
            return pathMapping + resolved;

        }
        // -- omission --
}

参数,lookupPath是&#34; /&#34;通过&#34; @ {/}&#34;,然后:

  • pathWithinMapping将是&#34;&#34;。
  • pathMapping将是&#34;&#34;。
  • 已解决的将是&#34;&#34;。

所以这个方法返回&#34;&#34;并将值设置为href =&#34;&#34;。

在我看来,如果pathWithinMapping是&#34;&#34;,继续for循环似乎很好。调用chain.resolveUrlPath似乎不太好。

谢谢,

答案 1 :(得分:0)

感谢您的详细解释和repro项目!

这实际上是一个错误:请参阅SPR-13241,将在Spring 4.1.8和4.2.0中修复。