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.

启动它