首页 文章

使用XML模板的Spring Boot和Thymeleaf

提问于
浏览
2

我有一个带有控制器的Spring Boot应用程序,它返回一个ModelAndView和Thymeleaf来渲染模板,模板位于/src/main/resources/templates/*.html

这工作正常,但我如何配置Spring和/或Thymeleaf来查找xml文件而不是html?

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

2 回答

  • 1

    在针对viewResolver和相关事情的各种bean defs尝试和失败之后,我终于通过更改我的application.yaml文件来实现这一点:

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

    对于那些稍后阅读的人,您可以使用您的application.properties文件(使用点表示法代替yaml缩进) .

  • 2

    这也有效:

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

相关问题