SpringBoot and Thymeleaf - Cannot initialize: no template resolvers have been set

我不是女神ヾ 2022-06-04 10:35 236阅读 0赞

在使用 Spring Boot 和 Thymeleaf 作为模板发送邮件的时候,遇到了no template resolvers have been set 异常

  • application.properties

    spring.mail.host=smtpdm.aliyun.com

    1. spring.mail.port=465
    2. spring.mail.username=***
    3. spring.mail.password=***
    4. spring.mail.properties.smtp.auth=true
    5. spring.mail.properties.smtp.starttls.enable=true
    6. spring.mail.properties.smtp.starttls.required=true
    7. spring.thymeleaf.enabled=true
    8. spring.thymeleaf.prefix=classpath:/templates/
    9. spring.thymeleaf.check-template-location=true
    10. spring.thymeleaf.suffix=.html
    11. spring.thymeleaf.mode=HTML5
    12. spring.thymeleaf.encoding=UTF-8
    13. spring.thymeleaf.content-type=text/html
    14. spring.thymeleaf.cache=false
  • Junit 代码

    @Test

    1. public void sendTemplateEmail() {
    2. logger.info("Start send email...");
    3. long startTime = System.currentTimeMillis();
    4. try {
    5. TemplateEngine templateEngine = new TemplateEngine();
    6. Context context = new Context();
    7. context.setVariable("url", "admin");
    8. String htmlContent = templateEngine.process("InternalServerErrorTemplate", context);
    9. MimeMessage message = mailSender.createMimeMessage();
    10. MimeMessageHelper messageHelper = new MimeMessageHelper(message);
    11. messageHelper.setFrom(MAIL_DELIVER);
    12. messageHelper.setTo(MAIL_DELIVER);
    13. messageHelper.setSubject("Template Email");
    14. messageHelper.setText(htmlContent, true);
    15. mailSender.send(message);
    16. logger.info("Send email success, cost {} million second", System.currentTimeMillis() - startTime);
    17. } catch (Exception e) {
    18. logger.error("Send email failed, error message is {}", e.getMessage());
    19. e.printStackTrace();
    20. }
    21. }
  • 异常信息

    org.thymeleaf.exceptions.ConfigurationException: Cannot initialize: no template resolvers have been set

    1. at org.thymeleaf.Configuration.initialize(Configuration.java:203)
    2. at org.thymeleaf.TemplateEngine.initialize(TemplateEngine.java:827)
    3. at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1038)
    4. at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011)
    5. at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:924)
    6. at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:898)
    7. at cn.com.hellowood.mail.MailApplicationTests.sendTemplateEmail(MailApplicationTests.java:153)
    8. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    9. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    10. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    11. at java.lang.reflect.Method.invoke(Method.java:498)
    12. at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    13. at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    14. at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    15. at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    16. at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    17. at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    18. at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    19. at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    20. at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
    21. at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
    22. at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    23. at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    24. at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    25. at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    26. at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    27. at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    28. at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    29. at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    30. at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)

    2017-12-11 22:00:05.974 ERROR 3382 —- [ main] c.c.hellowood.mail.MailApplicationTests : Send email failed, error message is Cannot initialize: no template resolvers have been set at org.junit.runner.JUnitCore.run(JUnitCore.java:137)

    1. at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    2. at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    3. at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    4. at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

  • 首先配置了 TemplateResolver

    package cn.com.hellowood.mail.config;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Description;
    import org.springframework.web.servlet.ViewResolver;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.thymeleaf.spring4.SpringTemplateEngine;
    import org.thymeleaf.spring4.view.ThymeleafViewResolver;
    import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
    import org.thymeleaf.templateresolver.TemplateResolver;

    @Configuration
    public class ThymeleafConfiguration extends WebMvcConfigurerAdapter {

    1. private final Logger logger = LoggerFactory.getLogger(getClass());
    2. @Bean
    3. @Description("Thymeleaf template resolver serving HTML5")
    4. public TemplateResolver templateResolver() {
    5. TemplateResolver templateResolver = new ServletContextTemplateResolver();
    6. templateResolver.setPrefix("/templates/mail/");
    7. templateResolver.setSuffix(".html");
    8. templateResolver.setCacheable(false);
    9. templateResolver.setTemplateMode("HTML5");
    10. templateResolver.setCharacterEncoding("UTF-8");
    11. logger.info("Config view resolver... ");
    12. return templateResolver;
    13. }
    14. @Bean
    15. @Description("Thymeleaf template engine with Spring integration")
    16. public SpringTemplateEngine templateEngine() {
    17. SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    18. templateEngine.setTemplateResolver(templateResolver());
    19. return templateEngine;
    20. }
    21. @Bean
    22. @Description("Thymeleaf view resolver")
    23. public ViewResolver viewResolver() {
    24. ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    25. viewResolver.setTemplateEngine(templateEngine());
    26. viewResolver.setCharacterEncoding("UTF-8");
    27. return viewResolver;
    28. }
    29. @Override
    30. public void addViewControllers(ViewControllerRegistry registry) {
    31. registry.addViewController("/").setViewName("index");
    32. }

    }

但是错误依然没有解决,后来在 Stack Overflow 上看到了解决方法:问题在于
TemplateEngine templateEngine = new TemplateEngine();是新生成一个 TemplateEngine 对象,这个对象没有任何配置,应当使用 @Autowired 注入对象

解决方法

  1. //将
  2. TemplateEngine templateEngine = new TemplateEngine();
  3. //改为
  4. @Autowired
  5. TemplateEngine templateEngine;

https://stackoverflow.com/questions/47125833/spring-and-thymeleaf-cannot-initialize-no-template-resolvers-have-been-set

发表评论

表情:
评论列表 (有 0 条评论,236人围观)

还没有评论,来说两句吧...

相关阅读