第二次创建PDF时,已经初始化了春季百里角themeaf TemplateEngine获取错误模板引擎

发布于 2025-02-07 13:40:10 字数 904 浏览 1 评论 0原文

当我从此HTML文件创建一个PDF时,第一次所有功能都可以完美地工作,并将PDF创建到我的本地计算机。但是,当我再次创建它时,它将返回此错误“模板引擎已经开始初始化(可能是因为它已经被执行或已从中请求完全构建的配置对象。在此状态下,不允许对其配置进行修改。 “如果我重新启动本地应用程序服务器,它将首次重新工作。我还尝试使用TemplateEngine.cleArteMplateCache()清除缓存。

看起来,当我第二次运行时,它使用加速模板解析器第二次运行。

@Service
public class LetterService {

    @Autowired
    private TemplateEngine templateEngine;

     private String processPdfTemplate(Map<String, Object> variables) {
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateEngine.setTemplateResolver(templateResolver);


        Context context = new Context();
        context.setVariables(variables);
        context.setLocale(Locale.getDefault());

        return templateEngine.process("index", context);
    }
} 

When i create a pdf from this html file everything works perfectly the first time and creates the pdf to my local machine. But when i create it again it returns this error "Template engine has already been initialized (probably because it has already been executed or a fully-built Configuration object has been requested from it. At this state, no modifications on its configuration are allowed." If i restart my local application server it works again the first time. I've also tried to clear the cache using templateEngine.clearTemplateCache().

It looks like when i run it the second time its using the cached template resolver.

@Service
public class LetterService {

    @Autowired
    private TemplateEngine templateEngine;

     private String processPdfTemplate(Map<String, Object> variables) {
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateEngine.setTemplateResolver(templateResolver);


        Context context = new Context();
        context.setVariables(variables);
        context.setLocale(Locale.getDefault());

        return templateEngine.process("index", context);
    }
} 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

倚栏听风 2025-02-14 13:40:10

您使用了Spring Bean的TemplateEngine。它不是线程安全,并且不能两次重新设置相同的对象。改用局部变量

     private String processPdfTemplate(Map<String, Object> variables) {
        TemplateEngine templateEngine = new SpringTemplateEngine();
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateEngine.setTemplateResolver(templateResolver);


        Context context = new Context();
        context.setVariables(variables);
        context.setLocale(Locale.getDefault());

        return templateEngine.process("index", context);
    }

或要缓存同一filepath的TemplateNegine,则可以使用ConcurrentHashMap缓存。还有一种替代方法可以用自己的Templateresolver创建自己的TemplateNegine Bean。

You used TemplateEngine from Spring Bean. It's not thread-safe and can't re-setup the same object twice. Use local varable instead

     private String processPdfTemplate(Map<String, Object> variables) {
        TemplateEngine templateEngine = new SpringTemplateEngine();
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateEngine.setTemplateResolver(templateResolver);


        Context context = new Context();
        context.setVariables(variables);
        context.setLocale(Locale.getDefault());

        return templateEngine.process("index", context);
    }

or if you want to cache the TemplateEngine for the same Filepath, you can cache it with ConcurrentHashMap. There is also an alternative to create your own TemplateEngine Bean with your own TemplateResolver.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文