我继承了 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呈现。是这样做的方式还是选择不当?
==============================
我还阅读了有关创建自定义模板加载器的信息,但是由于我已经构建了模板,所以我不太了解在哪里放置这些加载器或需要它。
谁能告诉我我要去哪里错了?