当前位置: 首页 > 知识库问答 >
问题:

Thymeleaf模板无法找到相关的JS、CSS和国际化文件

孟浩慨
2023-03-14

我正在开发spring boot 2 thymeleaf web应用程序。我想从jar文件中呈现一个模板及其静态资源。js、CSS和消息出现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()将返回加载我的测试的URLclassloader实例。jar文件(当前类的类加载器作为父类加载器传递)。这个jar文件包含所有我的模板(html文件)静态文件(JS、CSS、属性)。下面是jar文件的结构:

test.jar
 |
 |- mytemplates -> myhtml.html
 |- static
      |- js ->my.js
      |- css ->my.js
 |- i18N -> message.properties

看起来spring boot或thymeleaf无法从类加载器/jar文件中找到可以找到模板的资源。你能帮我解决这个问题吗?如何让spring boot thymeleaf查看特定的类加载器以找到静态资源?

我已经尝试设置ClassLoaderTemplateResources,但它入侵。

@Bean
public ClassLoaderTemplateResource secondaryResouceResolver() throws IOException
{
    ClassLoaderTemplateResource secondaryResoucreResolver = new ClassLoaderTemplateResource(getCustomeClassLoader(),
        "static/", "UTF-8");

    return secondaryResoucreResolver;
}

共有2个答案

宇文修筠
2023-03-14

如果我正确理解了您的需求,那么就不需要编写此代码。开始吧。Springio并让工具创建构建文件(maven或gradle),然后选择JAR类型。将文件放在工具创建的关联文件夹中。然后从IDE启动它。

于高雅
2023-03-14

我找不到任何可以使用jar文件或类加载器指向外部静态资源的机制。因此,为了从不在类路径中的jar文件中指向静态资源(Js/css)和消息文件,您需要覆盖一些Spring启动默认配置。首先,您需要提取某个文件夹中的jar文件,然后您需要覆盖WebMvcConfigrer接口的addResourceHandler()方法,如下所示:

 @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;
}

这将有助于从外部来源获取静态资源和消息源。如果有人知道更好的解决方案,请在此处留下您的评论。

 类似资料:
  • 我有以下bean配置 以下函数用于发送解析模板和发送电子邮件。 但这会给出一个FileNotFound异常。

  • 当我使用Spring Boot1.4.0+Thymeleaf时,我发现静态资源无法访问,并抛出错误“模板可能不存在或任何配置的模板解析器都无法访问”。 关于我的静态资源的文件夹结构 浏览器显示500错误

  • 我使用spring为我的项目,我排除了所有模板文件到另一个“HTML项目”。我这样做是因为我可以在没有任何重新部署的情况下进行更改,而且对我来说,它的方式更加清晰。它工作良好,spring应用程序找到所有模板。但现在,模板找不到任何css或js文件。模板试图搜索我的spring项目中的文件,但它们包含在html项目中。我该怎么修好它?我想我需要一条相对路径。 项目 SpringApp -----l

  • 我有一个使用thymeleaf的Spring启动程序。网页加载。但是网页找不到我的css文件。我看到以下由Spring启动记录。网页加载了这个url:http://localhost:9090/lotto/rawdataocc. GET /lotto/lotto.css没有映射 CSS文件位于resources/static目录下 Thymleleaf模板在模板目录下。

  • 问题内容: 如何使用诸如Velocity或FreeMarker之类的模板引擎构造电子邮件正文来实现i18n? 通常,人们倾向于创建如下模板: 并创建具有以下属性的资源包: 这就产生了一个基本的问题:如果我的文件很大,包含很多行文本,那么在单独的资源包()文件中翻译和管理每个文件就变得很麻烦。 我想做的是,为每种语言创建一个单独的文件,类似,然后以某种方式告诉Velocity / Spring根据输

  • 我正在使用库贝css框架(https://imperavi.com/kube/css/buttons/)。但是我不能在我的项目中实现这个框架。 当我尝试这样使用按钮时,会出现以下异常: 与元素类型“button”关联的属性名“small”后面必须跟“=”字符 这个按钮有小的和轮廓的属性吗。