Thymeleaf at syntax: "@{/}" returns 如果我包含 ResourceUrlEncodingFilter 则为空
Thymeleaf at syntax: "@{/}" returns empty if I include ResourceUrlEncodingFilter
我正在使用 Thymeleaf。
此模板:
<a th:href="@{/}">a</a>
产生这个 html:
<a href="/">a</a>
这是我所期望的。
我将 ResourceUrlEncodingFilter bean 放在我的 WebMvcConfigurerAdapter extended class.
中以尝试 ContentVersionStrategy
@Bean
public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
return new ResourceUrlEncodingFilter();
}
产生的html转为:
<a href="">a</a>
href 的值为空。
我希望 href 是“/”,即使我放了 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'
}
}
}
Spring Boot 添加“/**”匹配器用于静态 Web 资源位置的自动配置。
位置是 /META-INF/resources/、/resources/、/static/ 和 /public/。
当您在 Thymeleaf 模板中 html 下方放置时,
<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是"@{/}的"/",则:
- pathWithinMapping 将为“”。
- 路径映射将为“”。
- 解析为“”。
所以这个方法returns""并且值设置为href="".
这是我的看法,如果pathWithinMapping是"",继续for循环似乎不错。调用chain.resolveUrlPath好像不太好。
谢谢,
感谢您的详细解释和重现项目!
这实际上是一个错误:请参阅 SPR-13241,将在 Spring 4.1.8 和 4.2.0 中修复。
我正在使用 Thymeleaf。
此模板:
<a th:href="@{/}">a</a>
产生这个 html:
<a href="/">a</a>
这是我所期望的。
我将 ResourceUrlEncodingFilter bean 放在我的 WebMvcConfigurerAdapter extended class.
中以尝试 ContentVersionStrategy@Bean
public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
return new ResourceUrlEncodingFilter();
}
产生的html转为:
<a href="">a</a>
href 的值为空。
我希望 href 是“/”,即使我放了 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'
}
}
}
Spring Boot 添加“/**”匹配器用于静态 Web 资源位置的自动配置。 位置是 /META-INF/resources/、/resources/、/static/ 和 /public/。
当您在 Thymeleaf 模板中 html 下方放置时,
<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是"@{/}的"/",则:
- pathWithinMapping 将为“”。
- 路径映射将为“”。
- 解析为“”。
所以这个方法returns""并且值设置为href="".
这是我的看法,如果pathWithinMapping是"",继续for循环似乎不错。调用chain.resolveUrlPath好像不太好。
谢谢,
感谢您的详细解释和重现项目!
这实际上是一个错误:请参阅 SPR-13241,将在 Spring 4.1.8 和 4.2.0 中修复。