Thymeleaf 模板无法找到相关的 JS、CSS 和 i18n 文件
Thymeleaf template is not able to find related JS, CSS and i18n files
我正在开发 spring boot 2 + thymeleaf 网络应用程序。我想呈现一个模板,它是来自 jar 文件的静态资源。我收到 js、CSS 和 message.properties 文件的 404 错误,而模板在浏览器上呈现但相关的 js,css 不是。为了从 jar 文件呈现模板,我配置了 ClassLoaderTemplateResolver,如下所述:
@Bean
public ClassLoaderTemplateResolver secondaryTemplateResolver() throws IOException {
ClassLoaderTemplateResolver secondaryTemplateResolver = new
ClassLoaderTemplateResolver(getCustomeClassLoader());
secondaryTemplateResolver.setPrefix("mytemplates/");
secondaryTemplateResolver.setSuffix(".html");
secondaryTemplateResolver.setTemplateMode(TemplateMode.HTML);
secondaryTemplateResolver.setCharacterEncoding("UTF-8");
secondaryTemplateResolver.setOrder(2);
secondaryTemplateResolver.setCheckExistence(true);
return secondaryTemplateResolver;
}
其中 getCustomClassloader() 将 return URLclassloader 实例加载我的 test.jar 文件(当前 class' class loader 作为父 classloader 传递)。这个 jar 文件有我所有的模板(html 文件)+ 静态文件(JS,CSS,属性)。下面是jar文件的结构:
test.jar
|
|- mytemplates -> myhtml.html
|- static
|- js ->my.js
|- css ->my.js
|- i18N -> message.properties
看起来 spring boot 或 thymeleaf 无法从可以找到模板的 Classloader/jar 文件中找到资源。你能帮我解决这个问题吗?我如何告诉 spring boot + thymeleaf 查看特定的 classloader 以查找静态资源?
我已经尝试设置 ClassLoaderTemplateResource,但没有成功。
@Bean
public ClassLoaderTemplateResource secondaryResouceResolver() throws IOException
{
ClassLoaderTemplateResource secondaryResoucreResolver = new ClassLoaderTemplateResource(getCustomeClassLoader(),
"static/", "UTF-8");
return secondaryResoucreResolver;
}
在此先感谢您的帮助!
我找不到任何可以使用 jar 文件或类加载器指向外部静态资源的机制。因此,为了从不在类路径中的 jar 文件中指向静态资源 (Js/css) 和消息文件,您需要覆盖一些 spring 引导默认配置。首先,您需要将 jar 文件提取到某个文件夹中,然后您需要重写 WebMvcConfigurer 接口的 addResourceHandlers() 方法,如下所示:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
registry
.addResourceHandler("js/**") /*This must be relative request url for js*/
.addResourceLocations("file:/C:/MyStuff/jarfolder/js/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new PathResourceResolver());
registry
.addResourceHandler("css/**")/*This must be relative request url for css*/
.addResourceLocations("file:/C:/MyStuff/jarfolder/css/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new PathResourceResolver());
}
为了从 jar 文件中引用消息源,而不是在类路径中。您需要提取它,然后提供它的路径,如下所示:
@Bean
public MessageSource messageSource() throws IOException
{
ReloadableResourceBundleMessageSource messageSource =
new ReloadableResourceBundleMessageSource();
messageSource.setDefaultEncoding("UTF-8");
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.addBasenames("classpath:i18n/messages");
messageSource.addBasenames("file:/C:/MyStuff/jarfolder/messages");
return messageSource;
}
这将用于从外部源获取静态资源和消息源。如果有人知道更好的解决方案,请在这里留下您的评论。
如果我没看错你的需求,你应该不需要写这段代码。只需转到 start.spring.io 并让工具创建您的构建文件(maven 或 gradle)和 select JAR 类型。将您的文件放入该工具创建的关联文件夹中。然后从您的 IDE.
启动它
我正在开发 spring boot 2 + thymeleaf 网络应用程序。我想呈现一个模板,它是来自 jar 文件的静态资源。我收到 js、CSS 和 message.properties 文件的 404 错误,而模板在浏览器上呈现但相关的 js,css 不是。为了从 jar 文件呈现模板,我配置了 ClassLoaderTemplateResolver,如下所述:
@Bean
public ClassLoaderTemplateResolver secondaryTemplateResolver() throws IOException {
ClassLoaderTemplateResolver secondaryTemplateResolver = new
ClassLoaderTemplateResolver(getCustomeClassLoader());
secondaryTemplateResolver.setPrefix("mytemplates/");
secondaryTemplateResolver.setSuffix(".html");
secondaryTemplateResolver.setTemplateMode(TemplateMode.HTML);
secondaryTemplateResolver.setCharacterEncoding("UTF-8");
secondaryTemplateResolver.setOrder(2);
secondaryTemplateResolver.setCheckExistence(true);
return secondaryTemplateResolver;
}
其中 getCustomClassloader() 将 return URLclassloader 实例加载我的 test.jar 文件(当前 class' class loader 作为父 classloader 传递)。这个 jar 文件有我所有的模板(html 文件)+ 静态文件(JS,CSS,属性)。下面是jar文件的结构:
test.jar
|
|- mytemplates -> myhtml.html
|- static
|- js ->my.js
|- css ->my.js
|- i18N -> message.properties
看起来 spring boot 或 thymeleaf 无法从可以找到模板的 Classloader/jar 文件中找到资源。你能帮我解决这个问题吗?我如何告诉 spring boot + thymeleaf 查看特定的 classloader 以查找静态资源?
我已经尝试设置 ClassLoaderTemplateResource,但没有成功。
@Bean
public ClassLoaderTemplateResource secondaryResouceResolver() throws IOException
{
ClassLoaderTemplateResource secondaryResoucreResolver = new ClassLoaderTemplateResource(getCustomeClassLoader(),
"static/", "UTF-8");
return secondaryResoucreResolver;
}
在此先感谢您的帮助!
我找不到任何可以使用 jar 文件或类加载器指向外部静态资源的机制。因此,为了从不在类路径中的 jar 文件中指向静态资源 (Js/css) 和消息文件,您需要覆盖一些 spring 引导默认配置。首先,您需要将 jar 文件提取到某个文件夹中,然后您需要重写 WebMvcConfigurer 接口的 addResourceHandlers() 方法,如下所示:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
registry
.addResourceHandler("js/**") /*This must be relative request url for js*/
.addResourceLocations("file:/C:/MyStuff/jarfolder/js/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new PathResourceResolver());
registry
.addResourceHandler("css/**")/*This must be relative request url for css*/
.addResourceLocations("file:/C:/MyStuff/jarfolder/css/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new PathResourceResolver());
}
为了从 jar 文件中引用消息源,而不是在类路径中。您需要提取它,然后提供它的路径,如下所示:
@Bean
public MessageSource messageSource() throws IOException
{
ReloadableResourceBundleMessageSource messageSource =
new ReloadableResourceBundleMessageSource();
messageSource.setDefaultEncoding("UTF-8");
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.addBasenames("classpath:i18n/messages");
messageSource.addBasenames("file:/C:/MyStuff/jarfolder/messages");
return messageSource;
}
这将用于从外部源获取静态资源和消息源。如果有人知道更好的解决方案,请在这里留下您的评论。
如果我没看错你的需求,你应该不需要写这段代码。只需转到 start.spring.io 并让工具创建您的构建文件(maven 或 gradle)和 select JAR 类型。将您的文件放入该工具创建的关联文件夹中。然后从您的 IDE.
启动它