Java - Thymeleaf - Как обрабатывать InputStream в TemplateEngine? (Автономные шаблоны) - PullRequest
0 голосов
/ 15 ноября 2018

Я сталкиваюсь со сценарием, в котором мне нужно обработать шаблон HTML (index.html), который распаковывается из ZIP-файла (через ZipInputStream) через Thymeleaf TemplateEngine с моим POJO данных. Итак, сейчас у меня есть InputStream распакованного файла шаблона. Я верю, что TemplateResolver поможет мне решить этот вопрос.

TemplateResolver - это универсальная реализация, позволяющая вам указать свою собственную реализацию IResourceResolver, которая получает входные потоки любым удобным вам способом. Вы можете создать свой собственный распознаватель ресурсов (реализующий IResourceResolver) и установить для него экземпляр TemplateResolver.

Как выполнить эту задачу? Есть идеи?

    // index.html is the byte[] here, 'resourceData'
    InputStream fileinputStream = new ByteArrayInputStream(resourceData);
    FileResourceResolver fileResourceResolver = new FileResourceResolver();
    TemplateResolver resolver = new TemplateResolver();
    resolver.setTemplateMode("XHTML");
    resolver.setSuffix(".html");
    resolver.setResourceResolver(fileResourceResolver);
    TemplateEngine engine = new TemplateEngine();
    engine.setTemplateResolver(resolver);
    Context context = new Context(Locale.US);
    context.setVariable("data", myDataPojo);
    return engine.process("index", context);

1 Ответ

0 голосов
/ 17 ноября 2018

Я нашел способ :) Надеюсь, любой, кто сталкивается с той же проблемой, может использовать это решение.

private static class CustomTemplateResolver implements IResourceResolver {
        private InputStream inputStream;
        private String templateName;

        public CustomTemplateResolver(String templateName, InputStream inputStream) {
            this.templateName = templateName;
            this.inputStream = inputStream;
        }

        @Override
        public String getName() {
            return templateName;
        }

        @Override
        public InputStream getResourceAsStream(TemplateProcessingParameters templateProcessingParameters, String resourceName) {
            return inputStream;
        }
    }

Тестовый класс

@Test
    public void createPdfFromZip() throws Exception {
        String fileBundleZipFile = "sample.zip";
        String templateFileName = "index";
        String fileExt = ".html";
        ClassPathResource resourceZip = new ClassPathResource(fileBundleZipFile);
        ZipFile zipFile = new ZipFile(new File(this.getClass().getResource("/" + fileBundleZipFile).getFile()));
        ZipInputStream zipInputStream = new ZipInputStream(resourceZip.getInputStream());
        ZipEntry zipEntry = zipInputStream.getNextEntry();
        while (zipEntry != null) {
            if (zipEntry.getName().equals(templateFileName + fileExt)) {
                TemplateResolver resolver = new TemplateResolver();
                resolver.setTemplateMode("XHTML");
                resolver.setSuffix(fileExt);
                resolver.setResourceResolver(new CustomTemplateResolver(templateFileName, zipFile.getInputStream(zipEntry)));
                MyPojo data= getData();
                TemplateEngine engine = new TemplateEngine();
                engine.setTemplateResolver(resolver);
                Context context = new Context(Locale.US);
                context.setVariable("data", data);
                String dataHTMLString = engine.process(templateFileName, context);
                Path tempFile = Files.createTempFile("unzipped-data-html", ".pdf");
                createDataPdfWithCss(tempFile, dataHTMLString);
            }
            zipEntry = zipInputStream.getNextEntry();
        }
        zipInputStream.closeEntry();
        zipInputStream.close();
    }
...