gpt4 book ai didi

Springboot - Thymeleaf 尝试解析它不应该解析的文件

转载 作者:行者123 更新时间:2023-12-05 02:18:42 26 4
gpt4 key购买 nike

您好,我目前正在开发一个使用 thymeleaf 和 JSF 的 Web 项目(它是一个遗留系统,我们只能慢慢迁移到 thymeleaf,这就是为什么 JSF 仍然存在并且不能从一天到另一天删除,因为这是一个很多工作)。 Thymeleaf 配置为解析位于“thymeleaf”目录下的 webapp 目录中的 View 。如果我直接在 tomcat 服务器上部署应用程序,这将非常有效。来自其他目录然后是“thymeleaf”目录的页面也由 JSF 框架解析。

我在 JUnit 中添加了一些使用 SpringBoot 的集成测试。在这些测试中,我发现 thymeleaf 现在正在尝试解析任何目录中的任何页面。 JSF 被完全忽略了,因此我得到了一大堆 JUnit 测试失败。 thymeleaf 忽略其配置并想要解析所有文件有什么意义吗?这是我完整的 thymeleaf 配置,正如我所说,如果我将它部署在独立的 tomcat 上,它会完美运行。

private ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
this.applicationContext = applicationContext;
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
String imagesPattern = "/images/**";
String imagesLocation = basePath() + "resources/images/";
registry.addResourceHandler(imagesPattern).addResourceLocations(imagesLocation);
log.info("added resourceHandler (pathPattern: '{}'), (resourceLocation: '{}')",
imagesPattern,
imagesLocation);

String cssPattern = "/css/**";
String cssLocation = basePath() + "resources/css/";
registry.addResourceHandler(cssPattern).addResourceLocations(cssLocation);
log.info("added resourceHandler (pathPattern: '{}'), (resourceLocation: '{}')", cssPattern, cssLocation);
}

@Bean(name = "basepath")
public String basePath()
{
String basepath = "";

File file = new File(Optional.ofNullable(System.getenv("THYMELEAF_APP_RESOURCES"))
.orElse("thymeleaf-resources/"));
if (file.exists())
{
basepath = "file:" + file.getAbsolutePath();
}
if (!basepath.endsWith("/"))
{
basepath += "/";
}
log.info("basepath: {}", basepath);
return basepath;
}

@Bean
@Description("Thymeleaf View Resolver")
public ThymeleafViewResolver viewResolver(String basePath)
{
log.info("setting up Thymeleaf view resolver");
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine(basePath));
viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setCache(true);
return viewResolver;
}

public SpringTemplateEngine templateEngine(String basePath)
{
log.info("setting up Thymeleaf template engine.");
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver(basePath));
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}

private ITemplateResolver templateResolver(String basePath)
{
log.info("setting up Thymeleaf template resolver");
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix(basePath + "thymeleaf/views/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCacheable(false);
return resolver;
}

@Bean
public IMessageResolver thymeleafMessageSource(MessageSource messageSource)
{
SpringMessageResolver springMessageResolver = new SpringMessageResolver();
springMessageResolver.setMessageSource(messageSource);
return springMessageResolver;
}

编辑

我刚刚发现问题似乎更深层次。将 thymeleaf 的依赖项添加到我的 pom.xml 中似乎足以让 spring boot 将其加载到上下文中......我只是为了测试目的删除了我的 ThymeleafConfig 类,但 thymeleaf 仍然试图解析 JSF 页面......(是的我在执行测试之前做了 maven clean)

编辑 2

我现在阅读它并试图排除 ThymeleafAutoConfiguration 类,但它没有帮助。我的配置仍然被覆盖。到目前为止,这是我的配置。 (是的,这是整个项目中唯一的 EnableAutoConfiguration 注释)

    @Configuration
@EnableAutoConfiguration(exclude = {ThymeleafAutoConfiguration.class})
@Import({WebAppConfig.class, ThymeleafConfig.class})
public class SpringBootInitializer extends SpringBootServletInitializer

并且上面已经添加了我的 ThymeleafConfig 类。

最佳答案

Having the dependencies of thymeleaf added into my pom.xml seems to be enough for spring boot to load it into the context...

如果这让您感到惊讶,那么我建议您花一些时间退后一步,阅读一下 Spring Boot 的工作原理,尤其是它的自动配置功能。 This section引用文档是一个很好的起点。

简而言之,Spring Boot 采用约定优于配置的方法。如果依赖项在类路径上,Spring Boot 会假定您想要使用它,并使用合理的默认值对其进行配置。这就是它对 Thymeleaf 的作用。您可以使用 @SpringBootApplication 上的 excludes 属性为特定依赖项禁用此自动配置:

@SpringBootApplication(exclude={ThymeleafAutoConfiguration.class})
public class ExampleApplication {

}

您还可以使用 spring.autoconfigure.exclude 属性提供要排除的自动配置类的逗号分隔列表。列表中的每个条目都应该是 auto-configuration class 的完全限定名称.您可以将此属性与 @TestPropertySource 一起使用,以在逐个测试的基础上禁用自动配置。

关于Springboot - Thymeleaf 尝试解析它不应该解析的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44348619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com