Spring Boot & Thymeleaf 与 XML 模板

Spring Boot & Thymeleaf with XML Templates

我有一个 Spring 带有控制器的启动应用程序,该控制器 returns 一个 ModelAndView 和 Thymeleaf 来呈现模板,模板位于 /src/main/resources/templates/*.html

这很好用,但是我如何配置 Spring and/or Thymeleaf 以查找 xml 文件而不是 html?

如果有帮助,我正在使用 Gradle 和 org.springframework.boot:spring-boot-starter-web 依赖项来进行设置。我目前 运行 服务器使用 class 和 main 方法。

在对 viewResolver 和相关事物的各种 bean def 进行尝试并失败后,我终于通过对 application.yaml 文件的更改实现了此功能:

spring:
  thymeleaf:
    suffix: .xml
    content-type: text/xml

对于稍后阅读本文的人,您可以对 application.properties 文件执行类似操作(用点符号代替 yaml 缩进)。

这也行得通:

@Configuration
public class MyConfig
{
    @Bean
    SpringResourceTemplateResolver xmlTemplateResolver(ApplicationContext appCtx) {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();

        templateResolver.setApplicationContext(appCtx);
        templateResolver.setPrefix("classpath:/templates/");
        templateResolver.setSuffix(".xml");
        templateResolver.setTemplateMode("XML");
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setCacheable(false);

        return templateResolver;
    }

    @Bean(name="springTemplateEngine")
    SpringTemplateEngine templateEngine(ApplicationContext appCtx) {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(xmlTemplateResolver(appCtx));
        return templateEngine;
    }
}

以及用法

@RestController
@RequestMapping("/v2/")
public class MenuV2Controller {
    @Autowired
    SpringTemplateEngine springTemplateEngine;

    @GetMapping(value ="test",produces = {MediaType.APPLICATION_XML_VALUE})
    @ResponseBody
    public String test(){
        Map<String, String> pinfo = new HashMap<>();
        Context context = new Context();
        context.setVariable("pinfo", pinfo);
        pinfo.put("lastname", "Jordan");
        pinfo.put("firstname", "Michael");
        pinfo.put("country", "USA");

       String content = springTemplateEngine.process("person-details",context);
       return content;

  }
}

不要忘记 resources/templates 文件夹中的模板

<?xml version="1.0" encoding="UTF-8"?>
<persons >
    <person>
        <fname th:text="${pinfo['lastname']}"></fname>
        <lname th:text="${pinfo['firstname']}"></lname>
        <country th:text="${pinfo['country']}"></country>
    </person>
</persons>