Как встраивать и связывать данные JSON в шаблон HTML в веб-сервисе Java - PullRequest
2 голосов
/ 29 мая 2019

Я работаю над микросервисом Java PDF Generation с использованием весенней загрузки.Генерация PDF предназначена для двухэтапного процесса.

  1. Шаблонирование - HTML-шаблон с неким языком выражений, который непосредственно читает структуру json

  2. HTML в PDF - это генерирует pdf из html, созданного на шаге 1

Примечание: у меня есть несколько решений Java и JavaScript ( nunjucks / nodejs )для шагов 1 и 2, но мне действительно нужен более понятный подход, как изложено ниже.

  • Моя конечная точка отдыха будет принимать 2 параметра: html-шаблон и json
  • Структура json отображается наHTML-шаблон один к одному, и оба файла были предопределены для строгого контракта.
  • Конечная точка службы не должна выполнять какое-либо сопоставление объектов данных JSON с HTML-элементами Dom, например таблицами, строками и т. д.
  • Конечная точка только внедряет данные json в html, используя логику в коде java
  • html исполняется / обрабатывается и читает json напрямую, используя некоторый язык выражений, посколькусодержит структуру json
  • Затем конечная точка отвечает HTML-файлом с динамическими данными, которые можно отправить конечной точке веб-службы генератора PDF

Ниже приведен пример кода:

@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.ie без создания 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 голосов
/ 29 мая 2019

Одним из вариантов может быть использование 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();
    }
...