Java - Thymeleaf - 如何在 TemplateEngine 中处理输入流? (独立模板)

标签 java thymeleaf inputstream template-engine

我面临这样一个场景,我需要处理一个 HTML 模板 (index.html),该模板是通过 Thymeleaf TemplateEngine 使用我的数据 POJO 从 ZIP 文件(通过 ZipInputStream)解压缩的。 所以我现在拥有的是解压缩的模板文件的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);

最佳答案

我找到了方法:)希望任何面临同样问题的人都可以使用这个解决方案。

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();
    }

关于Java - Thymeleaf - 如何在 TemplateEngine 中处理输入流? (独立模板),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53323313/

相关文章:

css - Thymeleaf - 如何自动调整内容片段?

java - 使用 EnableAutoConfiguration 时如何更改默认端口 8080

java - 如果不使用,蓝牙套接字上的输入流读取将挂起

java - 如何在 Java 中打印导致异常的参数值?

Java 列表到 Thymeleaf 表单输入

java - 从套接字输入流读取返回的数据顺序错误

java - 如何使用java复制包含图像和文本的文件

java - 从 Android 联系人列表中的联系人获取家庭位置?

java - 问题包括 JSP 文件

java - 从 HttpResponse 克隆/多重读取输入流