以编程方式解析 Thymeleaf 模板

Abh*_*kar 7 spring templates thymeleaf spring-boot

我正在尝试使用 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;
}
Run Code Online (Sandbox Code Playgroud)

模板(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>
Run Code Online (Sandbox Code Playgroud)

用法:

@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?
}
Run Code Online (Sandbox Code Playgroud)

使用 Thymeleaf 3.0.0.BETA01。

Abh*_*kar 7

我在 Thymeleaf用户论坛的帮助下解决了这个问题。由于我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>
Run Code Online (Sandbox Code Playgroud)

JSON:

{
  "food": {
    "name": "[[${item['name']}]]",
    "price": "[[${item['price']}]]",
    "description": "[[${item['description']}]]",
    "calories": "[[${item['calories']}]]"
  } 
}
Run Code Online (Sandbox Code Playgroud)