如何将Freemarker模板返回到RESTful请求?

时间:2019-04-07 23:59:41

标签: rest spring-boot freemarker

我继承了 Spring Boot 应用程序,该应用程序将文件加载Freemarker模板返回到REST调用,而我试图将其更改为使用db加载模板。

我在其他地方读过很多文章,我可以从数据库构建模板,并可以用我的 Model 处理它。无法弄清楚如何将其返回给 RESTful 调用。返回新模板时,我一直遇到 500 错误。

基于文件的系统当前返回一个 ModelAndView 对象...但是我不知道此时会发生什么,所以我不知道如何使用我的模板。

基于文件的方法

    @RequestMapping(
            method = {RequestMethod.GET},
            value = "/os/mgr/order/{barcode}.html",
            produces = MediaType.TEXT_HTML_VALUE
    )
    public ModelAndView viewOrder(@PathVariable("barcode") String barcode,
                                  @RequestParam(value = "smsSent", required = false) boolean smsSent,
                                  Device device, HttpServletResponse response)
            throws Exception {
....
//Does some work such as building a Freemarker View object and adds the Model with the correct filename. 
//This file approach is exactly why I want to use DB as there are dozens of template files requiring individual updating = PIA
....
return modelAndView;
}

下面是我如何通过一些基本测试来创建 Template 对象,以检查所应用的模型。我只是不知道如何将模板返回到 REST 请求。

基于数据库的方法

FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();

VendorTemplate vendorTemplate = vendorTemplateService.getTemplateByVendor(order.getVendor());
StringTemplateLoader stringLoader = new StringTemplateLoader();
String firstTemplate = "firstTemplate";
stringLoader.putTemplate(firstTemplate, vendorTemplate.getTemplate());
Configuration cfg = new Configuration();
cfg.setTemplateLoader(stringLoader);
Template template = cfg.getTemplate(firstTemplate);

Map<String, Object> input = new HashMap<String, Object>();
input = buildModelForOrderPage(input);

//I used this just to check the model was being applied to the loaded template
Writer consoleWriter = new OutputStreamWriter(System.out);
template.process(input, consoleWriter);

Writer fileWriter = new FileWriter(new File("output.html"));
try {
    template.process(input, fileWriter);
} finally {
    fileWriter.close();
}

StringWriter stringWriter = new StringWriter();
template.process(input, stringWriter);

==============================

编辑 我将返回类型更改为ResponseEntity,并将返回类型更改为

return ResponseEntity
            .status(200)
            .header("Content-Type", "text/html")
            .body(builtTemplate);

和我的html呈现。是这样做的方式还是选择不当

==============================

我还阅读了有关创建自定义模板加载器的信息,但是由于我已经构建了模板,所以我不太了解在哪里放置这些加载器或需要它。

谁能告诉我我要去哪里错了?

0 个答案:

没有答案