【问题标题】:Java Spring Boot & Thymeleaf: An error happened during template parsingJava Spring Boot 和 Thymeleaf:模板解析时出错
【发布时间】:2020-10-07 21:55:09
【问题描述】:

我正在开发一个 Java Spring Boot Web App,用户可以在其中注册。当他们注册时,他们会收到一封验证电子邮件。当我尝试获取电子邮件中的链接以实际确认注册时,这不再起作用,因为我收到错误:“模板解析期间发生错误(模板:“mail/verifyEmail.html”)”。我不确定为什么会这样。我在 verifyEmail.html 文件下方附加了附件,然后是附带的 EmailService.java 文件,该文件具有 EmailService() 和 sendVerificationEmail() 方法:

<!DOCTYPE html>
<html>

<th:block xmlns:th="http://www.thymeleaf.org">

<span th:text="'Hello ' + ${name}"></span>

<p>Thank you for registering for the bcoreHW site!</p>
<p>Please click <a href="#">here</a> to verify your email address.</p>

</th:block>

</html>
import java.util.Date;

import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

@Service
public class EmailService {
    @Autowired
    private JavaMailSender mailSender;

    @Value("${mail.enable}")
    private boolean enable;

    private TemplateEngine templateEngine;

    private void send(MimeMessagePreparator preparator) {
        if(enable) {
            mailSender.send(preparator);
        }
    }

    @Autowired
    public EmailService(TemplateEngine templateEngine) {

        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setPrefix("mail/"); 
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");
        templateResolver.setCacheable(false);
        templateEngine.setTemplateResolver(templateResolver);

        this.templateEngine = templateEngine;
    }

    public void sendVerificationEmail(final String emailAddress) {

        Context context = new Context();
        context.setVariable("name", "Bob");

        final String emailContents = templateEngine.process("verifyEmail", context);

        System.out.println(emailContents);

        MimeMessagePreparator preparator = new MimeMessagePreparator() {

            // not working for some reason: @Override
            public void prepare(MimeMessage mimeMessage) throws Exception {

                MimeMessageHelper message = new MimeMessageHelper(mimeMessage);

                message.setTo(emailAddress);
                message.setFrom(new InternetAddress("no-reply@testSite.com"));
                message.setSubject("Please Verify Your Email Address");
                message.setSentDate(new Date());
                message.setText(emailContents, true);
            }
        };

        send(preparator);
    }
}

有人认为这有什么问题吗?谢谢。另外,这是我收到的错误消息:

Caused by: java.io.FileNotFoundException: ClassLoader resource "mail/verifyEmail.html" could not be resolved
    at org.thymeleaf.templateresource.ClassLoaderTemplateResource.reader(ClassLoaderTemplateResource.java:130) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:223) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]

【问题讨论】:

  • 我无法根据您问题中的信息重新创建任何错误。当 Thymeleaf 渲染或模板解析失败时,服务器上应该有详细的错误消息,包含一个或多个“由...引起”的原因。您可以将这些添加到问题中吗?
  • 旁注:看到&lt;html xmlns:th="http://www.thymeleaf.org"&gt; 而不是&lt;th:block xmlns:th="http://www.thymeleaf.org"&gt; 更典型。换句话说,命名空间位于&lt;html&gt; 标记中,而不是任何其他标记中。但在这种情况下,这似乎无关紧要。
  • 很抱歉。发布在上面。
  • 谢谢。查看相关问题 - 例如herehere - 可能还有其他问题。我认为在 SpringBoot 中将您的 Thymeleaf 模板放在 src/main/resources 中更为典型 - 然后 not 通过解析器显式设置任何内容。让 Spring 自动执行。 (我不怎么用 Spring)。
  • 我发现了问题。我的前缀“mail/”不正确,因为它实际上位于名为“mailTemplates”的目录中。我的天啊哈哈。

标签: java spring-boot thymeleaf


【解决方案1】:

我发现了问题。我的前缀“mail/”不正确,因为它实际上位于名为“mailTemplates”的目录中。傻我。

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2019-05-02
    • 2020-03-14
    • 2016-01-27
    • 2016-12-21
    相关资源
    最近更新 更多