如何在Java Web Service中将JSON数据嵌入和绑定到HTML模板

时间:2019-05-29 07:35:53

标签: java json spring-boot thymeleaf freemarker

我正在使用Spring Boot开发Java PDF Generation微服务。 pdf的生成应分为两个阶段。

  1. 模板化-具有某种表达语言的html模板,可直接读取json结构

  2. HTML到PDF-这将从步骤1中生成的html生成pdf

注意:对于第1步和第2步,我有一些Java和JavaScript( nunjucks / nodejs )解决方案,但是我确实需要一种更易于维护的方法,如下所示。

  • 我宁静的端点将使用2个参数,即html模板和json
  • json结构一对一映射到html模板,并且两个文件都已预定义为严格合同。
  • 服务端点不应对json数据到html Dom元素进行任何对象映射,例如表格,行等
  • 端点仅使用Java代码中的逻辑将json数据嵌入到html中
  • 由于html包含json结构,因此它会执行/渲染并直接使用某种表达式语言读取json
  • 然后,终结点使用带有动态数据的html进行响应,可以将其发送到pdf生成器Web服务终结点

下面是示例代码:

@POST
 @Path("createPdf")   
 public Response createPdf(String htmlTemplateParam, String json) {

 //Read template from endpoint param or start off with reading local html template from resource folder
String templateHtml = IOUtils.toString(getClass().getResourceAsStream(HTMLTemplateFiles.INCOMING_TEMPLATE));

RequestJson requestJson = [Prepare json before passing to HTML Template]];

if(requestJson.isContentValid()) {

    LOG.info("incoming data successfully validated");

    // TODO     
    // Pass the requestJson (Endpoint Param JSON ) to templateHtml
    // Trigger the reading of the Json data and populating different HTML DOM elements using some sort of expression predifined in HTML

    // Get hold of the rendered HTML         
    String resolvedHtml = [HTML with data from json param into endpoint];

    // The next bit is done
    String pdf = htmlToPdfaHandler.generatePdfFromHtml(resolvedHtml);

    javax.ws.rs.core.Response response = Response.ok().entity(Base64.decodeBase64(pdf)).build();
            }
}

模板化阶段是我需要帮助的地方。

请问,为此的最佳技术解决方案是什么?

我对Java和JavaScript框架感到满意,并乐于学习您建议的任何框架。

但是,我的主要设计目标是确保随着我们拥有新模板以及模板和数据的更改,非技术人员可以更改html / json并生成pdf。

此外,模板和数据更改均不需要更改Java代码。

脑海里有一些东西,例如jsonpath,百里香叶,JavaScript等。但是,我喜欢最佳实践,喜欢向具有类似用例的真实经验的人学习。

经过进一步的研究和第一个答案,我也在考虑下面的freemarker解决方案。

但是,我如何通过读取输入json.i.来自动创建一个免费的标记模板数据?无需创建POJO / DTO

基于第一个答案:

     Configuration cfg = new Configuration(new Version("2.3.23"));
            cfg.setDefaultEncoding("UTF-8");

            // Loading you HTML template (via file or input stream):
            Template template = cfg.getTemplate("template.html");

  // Will this suffice for all JSON Structure, including nested deep ones

           Type mapType = new TypeToken<Map<String, Object>>(){}.getType(); 

    Map<String, String[]> templateData = new Gson().fromJson(json, mapType);

            try (StringWriter out = new StringWriter()) {
         // In output stream the result will be template with values from map:
                template.process(templateData, out);
                System.out.println(out.getBuffer().toString());

                out.flush();
            }

谢谢。

注意:欢迎使用代码段,伪代码和参考。

1 个答案:

答案 0 :(得分:0)

其中一个选项可能是FreeMarker的用法:

    Configuration cfg = new Configuration(new Version("2.3.23"));
    cfg.setDefaultEncoding("UTF-8");

    // Loading you HTML template (via file or input stream):
    Template template = cfg.getTemplate("template.html");

    // You need convert json to map of parameters (key-value):
    Map<String, Object> templateData = new HashMap<>();
    templateData.put("msg", "Today is a beautiful day");

    try (StringWriter out = new StringWriter()) {
        // In output stream the result will be template with values from map:
        template.process(templateData, out);
        System.out.println(out.getBuffer().toString());

        out.flush();
    }