当前位置: 首页 > 知识库问答 >
问题:

Thymeleaf ClassLoaderTemplateResolver找不到电子邮件模板,但只能在linux上找到

段干长恨
2023-03-14

我们目前正在为SpringMVC网站使用Thymeleaf。最近,我们决定使用它来处理丰富的HTML电子邮件模板。我在这里举了一个例子:http://www.thymeleaf.org/doc/springmail.html.

ClassLoaderTemplateResolver的前缀为“email/”,模板存储在“src/main/resources/”下的“email”子文件夹中,该文件夹似乎就是它查找模板的地方。

在我使用Windows 7/Tomcat7/Eclipse的开发机器上,一切正常,但是当我将. war文件发布到Amazon的EC2(Linux环境/Tomcat7)并试图生成电子邮件时失败了。这是错误:

错误C: U:org.thymeleaf.TemplateEngine-[THYMELEAF][pool-2-thell-2]异常处理模板email_template.html:ServletContext的资源解析org.thymeleaf.resourceresolver.ServletContextResourceResolver只能在上下文实现时执行org.thymeleaf.context.IWebContext[当前上下文:org.thymeleaf.context.上下文]

如果我从/src/main/resources/email中删除/重命名模板,我会在我的windows开发人员计算机上收到此错误消息,因此我假设ClassLoaderTemplateResolver找不到模板,然后模板引擎会尝试ServletContextResourceResolver,因为它没有WebContext,所以无法使用。

基于java的配置如下所示:

@Bean
public ServletContextTemplateResolver templateResolver() {
    final ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
    resolver.setPrefix("/WEB-INF/templates/");
    resolver.setTemplateMode("HTML5");
    resolver.setCharacterEncoding(appSettings.getDefaultEncoding());
    resolver.setOrder(2);
    resolver.setCacheable(!appSettings.isDebugMode() || !appSettings.isOneBoxMode());
    return resolver;
}

@Bean ClassLoaderTemplateResolver emailTemplateResolver() {
    final ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
    resolver.setPrefix("email/");
    resolver.setTemplateMode("HTML5");
    resolver.setCharacterEncoding(appSettings.getDefaultEncoding());
    resolver.setOrder(1);
    return resolver;
}

@Bean
public SpringTemplateEngine templateEngine() {
    final SpringTemplateEngine engine = new SpringTemplateEngine();
     final Set<TemplateResolver> templateResolvers = new HashSet<TemplateResolver>();
     templateResolvers.add(templateResolver());
     templateResolvers.add(emailTemplateResolver());
     engine.setTemplateResolvers(templateResolvers);
    return engine;
}

生成电子邮件的代码如下所示:

final String template = "email_template.html";

// prepare the context
final Context ctx = new Context(LocaleContextHolder.getLocale());

// create the body using ThymeLeaf
final String htmlContent = templateEngine.process(template, ctx);

奇怪的是,我见过前缀为“/META-INF/templates”的ClassLoaderTemplateResolver和类似的例子。路径不是必须在“src/main/resources”下,而不是“/src/main/webapp”下吗?我还尝试用FileTemplateResolver替换它,但无论我做了什么尝试,我都不知道将模板文件放在哪里以及将前缀设置为什么路径。

我的windows dev机器和亚马逊的linux box有什么不同?起初,我假设filepath的大小写敏感性可能是罪魁祸首,但我排除了这种可能性。救命啊!

共有2个答案

令狐晟
2023-03-14

你在当地部署了战争吗?还是你在日蚀中测试?如果你没有在本地使用战争,就像部署战争一样打包战争。解压并验证您的模板是否在WEB-INF/类中

只是一个关于META-INF的旁注,我以前在/META-INF/for spring项目中托管过配置文件,它是我存储在WEB-INF中的SpringMVC上下文配置。

丘学海
2023-03-14

Annnnnnd我是个白痴...我在存储电子邮件模板的文件夹名称和电子邮件模板名称之间有一个反斜杠,例如“文件夹\template.html”,而不是“文件夹/template.html”。这在windows上有效,但在linux上无效。

 类似资料:
  • 问题内容: 我在J2SE下使用log4j。我已将其配置为对某种类型的日志事件使用邮件程序。当logger.error触发时,出现以下异常: 有人遇到过吗?我也包括所需的mail.jar库。 任何帮助表示赞赏。谢谢克里斯 问题答案: 我查看了的源代码,该错误基本上表示了它的意思。未设置名为“ java.home”的系统属性。根据for的javadoc ,该属性由JVM自动设置为java安装目录。 我

  • 问题内容: 所以我想安装 https://www.npmjs.com/package/@progress/kendo-react- grid 该软件包存在于网站上,但是当我运行命令时 我收到404错误 想法? 到目前为止,我认为用户范围是什么 第二次尝试 问题答案: 我看着我的,这就是里面的东西 与该用于评论查看文档 我注释掉了所有4行,并且能够运行 无论出于何种原因,我都没有在https://w

  • 我试图通过Django制作一个新网站的主页。我的应用程序名称是“博客”,主页是home.html当我去http://127.0.0.1:8000/blog/home/时,我仍然收到错误模板不存在 我确保在settings.py中将“blog”添加到我的模板中,并在主目录中以及通过blog/templates/blog/home.html添加文件夹模板 myproject/blog/views.py

  • 我编写了一个Java应用程序,通过LDAP搜索Active directory以获取用户信息。我有一个传入的自定义Person类实例列表。在它我有DN或电子邮件定义。我正在相应地修改搜索条件。代码如下: 代码工作时没有错误,但当指定DN时,它确实找到了一个人,但当定义email时,它什么也找不到。但是,如果复制生成的筛选器字符串并将其以以下形式传递给ldapsearch命令: ldapsearch

  • 我一直在尝试设置AWS简单电子邮件服务,作为一种将收到的电子邮件转发到我的自定义域到我的Gmail帐户的方式,而不需要任何电子邮件托管服务。 我已经设置并验证了我的自定义域(mycustomdomain.com),还验证了它们将转发到的电子邮件地址(myemail@gmail.com)因为我仍然处于沙箱模式。 在电子邮件接收下- 没有指定收件人,我认为这应该允许为我的自定义域下的所有收件人触发此规

  • 发送电子邮件时,页脚中有下面的标准消息。 此电子邮件是使用CakePHP框架发送的,http://cakephp.org. 它似乎使用了这个: 我的控制器里有这个。 创建了以下视图: /应用程序/查看/电子邮件/文本/梦想。ctp /应用程序/视图/布局/电子邮件/文本/梦想。ctp 是否有任何其他设置我错过了cakephp使用我的布局? *注:如果我重新命名我的梦想。ctp默认。ctp它使用那个