Thymeleaf:Spring Boot 中 SVG 的第二个解析器

Thymeleaf: second resolver for SVG in Spring Boot

我正在尝试为使用 thymeleaf 属性的 SVG 设置第二个解析器,因此它需要由我的 spring 引导应用程序中的模板引擎解析。到目前为止我的实施:

ThymeleafSvgConfig

@Configuration
public class ThymeleafSvgConfig {
    @Bean
    public FileTemplateResolver svgTemplateResolver(){
    FileTemplateResolver svgTemplateResolver = new FileTemplateResolver();
    svgTemplateResolver.setPrefix("classpath:/svgtemplates/");
    svgTemplateResolver.setSuffix(".svg");
    svgTemplateResolver.setTemplateMode("XML");
    svgTemplateResolver.setCharacterEncoding("UTF-8");
    svgTemplateResolver.setOrder(0);

    return svgTemplateResolver;
    }

}

ThymeleafSvgController

@Controller
public class ThymeleafSvgController {
    @Autowired
    private ServletContext servletContext;
    @Autowired
    private TemplateEngine templateEngine;

    //.. logging etc.

    @RequestMapping(value = "/getSvg", method = { RequestMethod.GET, RequestMethod.POST })
    public void getSvg(@RequestParam(required = false) String type, HttpServletRequest request, HttpServletResponse response) {

    WebContext context = new WebContext(request, response, servletContext, request.getLocale());
    templateEngine.process("test", context, response.getWriter());
    }
}

我读到 Spring Boot 会自动搜索解析器并将它们添加到引擎 [s. this]。所以我假设,我的配置应该足够了,并且通过自动装配我应该得到正确的模板引擎。
但是我在尝试调用时仍然在我的应用程序中收到相同的错误:
templateEngine.process("test", context, response.getWriter());
我的 SVG 保存在 /src/main/resources/svgtemplates/test.svg

异常:
org.thymeleaf.exceptions.TemplateInputException: Error resolving template "test", template might not exist or might not be accessible by any of the configured Template Resolvers

我不确定我配置有误,所以我需要一些帮助。 FileTemplateResolver 是正确的 class 吗?我也尝试了 ClassLoaderTemplateResolver 但它抛出了同样的异常。来自 spring 引导的标准 Thymeleaf Resolver 工作正常,它与标准前缀一起工作:"classpath:/templates/"。所以考虑到 'templates' 和 'svgtemplates' 位于同一个文件夹中,我的前缀到目前为止应该是正确的,不是吗?
也许其他人看到了这个缺陷。

问题是 FileTemplateResolver 无法处理 'classpath:' 表示法。提供完整的文件路径后,解析器开始工作。

您可以将 SpringResourceTemplateResolver 与支持 classpath: 表示法的 Spring 引导一起使用:

@Bean
public ITemplateResolver svgTemplateResolver()
{
    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    resolver.setPrefix("classpath:/templates/svg");
    resolver.setSuffix(".svg");
    resolver.setTemplateMode("XML");

    return resolver;
}

您可能还想在应用程序配置中设置 spring.thymeleaf.template-resolver-order = 0 以优先考虑默认解析器(通常用于 HTML 模板)。