Programmatically Solve Thymeleaf Templates

I am trying to display XML / JSON using Thymeleaf templates. I don’t want to display the view using the template name, I just want to enable the template as shown below. The problem is that I will return, this is the name of the template, not the content.

Setup:

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

Template (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>

Application:

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

Using Thymeleaf 3.0.0.BETA01.

+4
source share
1 answer

I solved this problem using the Thymeleaf user forum. For reasons unbeknownst, it templateEngine.addTemplateResolverdoes not work, but templateEngine.setTemplateResolverit does. The following are templates for outputting XML and 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']}]]"
  } 
}
+3
source

Source: https://habr.com/ru/post/1623836/


All Articles