以编程方式解析Thymeleaf模板

时间:2016-01-11 22:30:18

标签: spring templates spring-boot thymeleaf

我尝试使用Thymeleaf模板渲染XML / JSON。我不想使用模板名称渲染视图,只想解析模板,如下所示。麻烦就是我得到的只是模板名称,而不是它的内容。

设置:

@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.name());
    templateResolver.setCacheable(false);

    return templateResolver;
}

@Bean
SpringTemplateEngine templateEngine(ApplicationContext appCtx) {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.addTemplateResolver(xmlTemplateResolver(appCtx));

    return templateEngine;
}

模板(src / main / resources / templates / breakfast-menu.xml):

<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
    <food>
        <name>${item['name']}</name>
        <price>${item['price']}</price>
        <description>${item['description']}</description>
        <calories>${item['calories']}</calories>
    </food>
</breakfast_menu>

用法:

@Autowired
SpringTemplateEngine templateEngine;

someMethod() {
    Context context = new Context();
    context.setVariable("item", item);
    item.put("name", "Waffle");
    String content = templateEngine.process("breakfast-menu", context);

    // content == "breakfast-menu". WTH?
}

使用Thymeleaf 3.0.0.BETA01。

1 个答案:

答案 0 :(得分:3)

我在Thymeleaf user forum的帮助下解决了这个问题。出于我不熟悉的原因,templateEngine.addTemplateResolver不起作用,templateEngine.setTemplateResolver不起作用。 XML和JSON输出的模板如下所示:

XML:

<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
    <food>
        <name th:text="${item['name']}"></name>
        <price th:text="${item['price']}"></price>
        <description th:text="${item['description']}"></description>
        <calories th:text="${item['calories']}"></calories>
    </food>
</breakfast_menu>

JSON:

{
  "food": {
    "name": "[[${item['name']}]]",
    "price": "[[${item['price']}]]",
    "description": "[[${item['description']}]]",
    "calories": "[[${item['calories']}]]"
  } 
}