关于 GenericApplicationContext 中 getResource 的实现
About implementation of getResource in GenericApplicationContext
Spring-web,webmvc 4.1.6
百里香叶 2.1
我一直致力于在 SpringBoot 中手动配置 Thymeleaf。
我想在带有 "classpath:" 前缀的 ServletContextTemplateResolver 中设置路径。
我该怎么做才能解决这个问题?
@Bean
public ServletContextTemplateResolver templateResolver() {
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
templateResolver.setPrefix("classpath:/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
templateResolver.setCacheable(false);
return templateResolver;
}
但是没用。原因是下面的代码。
在 org.springframework.context.support.GenericApplicationContext
@Override
public Resource getResource(String location) {
if (this.resourceLoader != null) {
return this.resourceLoader.getResource(location); // with setting of template resolver
}
return super.getResource(location); // without setting of template resolver
}
没有ServletContextTemplateResolver的任何设置,
GenericApplicationContext.getResource 被调用。
有了它的设置
StandardRoot.getResourceAsStream 被调用。
但是这个方法没有实现支持 "class: " 前缀。
获取资源成功
"ClassPathResource is implemented"
@Override
public Resource getResource(String location) {
Assert.notNull(location, "Location must not be null");
if (location.startsWith("/")) {
return getResourceByPath(location);
}
else if (location.startsWith(CLASSPATH_URL_PREFIX)) {
return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
}
else {
try {
// Try to parse the location as a URL...
URL url = new URL(location);
return new UrlResource(url);
}
catch (MalformedURLException ex) {
// No URL -> resolve as resource path.
return getResourceByPath(location);
}
}
}
获取资源失败
在这段代码中,前缀没有实现,我意识到我不能对 ServletContextTemplateResolver 的 属性 使用 "class:" 前缀。
在org.apache.catalina.webresources.StandardRoot
@Override
public InputStream getResourceAsStream(String path) {
if (path == null)
return (null);
if (!path.startsWith("/") && GET_RESOURCE_REQUIRE_SLASH)
return null;
WebResourceRoot resources = context.getResources();
if (resources != null) {
return resources.getResource(path).getInputStream();
}
return null;
}
很抱歉我能够解决这个问题。
http://forum.thymeleaf.org/Loading-templates-from-external-source-td4025309.html
我改用了 ClassLoaderTemplateResolver。
classLoaderTemplateResolver.setPrefix("templates/");
为了将您的模板作为类路径项加载,并且 可选 支持 prefix 路径,您应该使用 ClassLoaderResourceResolver
而不是 ServletContextTemplateResolver
(后者相对于您的 Web 应用程序上下文解析模板,即在 /WEB-INF/ 目录下):
@Bean
public ServletContextTemplateResolver templateResolver() {
ITemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setPrefix("templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
templateResolver.setCacheable(false);
return templateResolver;
}
请注意,不需要将 classpath: 前缀附加到您的模板路径前缀,因为类加载器解析器默认看起来进入你的类路径。
您可能需要查看每个 org.thymeleaf.templateresolver.TemplateResolver
子类,它们提供不同的资源加载技术:
Spring-web,webmvc 4.1.6 百里香叶 2.1
我一直致力于在 SpringBoot 中手动配置 Thymeleaf。 我想在带有 "classpath:" 前缀的 ServletContextTemplateResolver 中设置路径。 我该怎么做才能解决这个问题?
@Bean
public ServletContextTemplateResolver templateResolver() {
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
templateResolver.setPrefix("classpath:/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
templateResolver.setCacheable(false);
return templateResolver;
}
但是没用。原因是下面的代码。 在 org.springframework.context.support.GenericApplicationContext
@Override
public Resource getResource(String location) {
if (this.resourceLoader != null) {
return this.resourceLoader.getResource(location); // with setting of template resolver
}
return super.getResource(location); // without setting of template resolver
}
没有ServletContextTemplateResolver的任何设置, GenericApplicationContext.getResource 被调用。
有了它的设置 StandardRoot.getResourceAsStream 被调用。 但是这个方法没有实现支持 "class: " 前缀。
获取资源成功
"ClassPathResource is implemented"
@Override
public Resource getResource(String location) {
Assert.notNull(location, "Location must not be null");
if (location.startsWith("/")) {
return getResourceByPath(location);
}
else if (location.startsWith(CLASSPATH_URL_PREFIX)) {
return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
}
else {
try {
// Try to parse the location as a URL...
URL url = new URL(location);
return new UrlResource(url);
}
catch (MalformedURLException ex) {
// No URL -> resolve as resource path.
return getResourceByPath(location);
}
}
}
获取资源失败
在这段代码中,前缀没有实现,我意识到我不能对 ServletContextTemplateResolver 的 属性 使用 "class:" 前缀。
在org.apache.catalina.webresources.StandardRoot
@Override
public InputStream getResourceAsStream(String path) {
if (path == null)
return (null);
if (!path.startsWith("/") && GET_RESOURCE_REQUIRE_SLASH)
return null;
WebResourceRoot resources = context.getResources();
if (resources != null) {
return resources.getResource(path).getInputStream();
}
return null;
}
很抱歉我能够解决这个问题。
http://forum.thymeleaf.org/Loading-templates-from-external-source-td4025309.html
我改用了 ClassLoaderTemplateResolver。
classLoaderTemplateResolver.setPrefix("templates/");
为了将您的模板作为类路径项加载,并且 可选 支持 prefix 路径,您应该使用 ClassLoaderResourceResolver
而不是 ServletContextTemplateResolver
(后者相对于您的 Web 应用程序上下文解析模板,即在 /WEB-INF/ 目录下):
@Bean
public ServletContextTemplateResolver templateResolver() {
ITemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setPrefix("templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
templateResolver.setCacheable(false);
return templateResolver;
}
请注意,不需要将 classpath: 前缀附加到您的模板路径前缀,因为类加载器解析器默认看起来进入你的类路径。
您可能需要查看每个 org.thymeleaf.templateresolver.TemplateResolver
子类,它们提供不同的资源加载技术: