【问题标题】:Field templateEngine in MailComponent required a bean of type 'org.thymeleaf.TemplateEngine' that could not be foundMailComponent 中的字段 templateEngine 需要找不到类型为“org.thymeleaf.TemplateEngine”的 bean
【发布时间】:2020-06-16 09:50:57
【问题描述】:

我是 Spring 新手所以,我遇到了这样的问题: 说明:

com.diet4you.LapkoEkaterina.MailComponent 中的字段 templateEngine 需要一个无法找到的“org.thymeleaf.TemplateEngine”类型的 bean。

注入点有以下注解: - @org.springframework.beans.factory.annotation.Autowired(required=true)

找到以下候选但无法注入: - 'ThymeleafAutoConfiguration.ThymeleafDefaultConfiguration' 中的 Bean 方法 'templateEngine' 未加载,因为 @ConditionalOnBean(类型:org.thymeleaf.spring5.ISpringTemplateEngine;SearchStrategy: all)找到了 'org.thymeleaf.spring5.ISpringTemplateEngine' 模板引擎类型的 bean - 'ThymeleafAutoConfiguration.ThymeleafReactiveConfiguration' 中的 Bean 方法 'templateEngine' 未加载,因为未找到响应式 Web 应用程序类

行动:

考虑重新访问上面的条目或在您的配置中定义一个“org.thymeleaf.TemplateEngine”类型的 bean。

邮件组件:

@Component
public class MailComponent {
    @Autowired
    MailSender mailSender;

    @Autowired
    JavaMailSender javaMailSender;

    @Autowired
    TemplateEngine templateEngine;

    public boolean sendSimpleMail(Contact contact) {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setFrom(contact.getEmail());
        mailMessage.setSubject(contact.getSubject());
        mailMessage.setText(contact.getMessage());
        mailMessage.setTo("email@email.com"); // if you use Gmail do not forget to put your personal address

        try {
            mailSender.send(mailMessage);
            return true;
        } catch (MailException e) {
            System.err.println(e.getMessage());
            return false;
        }
    }

    public boolean sendHtmlMail(Contact contact) {

        Context context = new Context();
        context.setVariable("contact", contact);
        final String messageHtml = templateEngine.process("email/contact", context);

        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mailMessage = new MimeMessageHelper(mimeMessage);
        try {
            mailMessage.setTo("email@email.com"); // if you use Gmail do not forget to put your personal address
            mailMessage.setFrom(contact.getEmail());
            mailMessage.setSubject(contact.getSubject());
            mailMessage.setText(messageHtml, true);
            javaMailSender.send(mimeMessage);
            return true;
        } catch (MessagingException | MailException e) {
            System.err.println(e.getMessage());
            return false;
        }
    }
}

邮件配置:

@PropertySource(ignoreResourceNotFound = true, value = "classpath:ValidationMessages.properties")
@Configuration
public class MailConfig {

    @Value("${spring.mail.host}")
    private String host;

    @Value("${spring.mail.port}")
    private int port;

    @Value("${spring.mail.default-encoding}")
    private String encoding;

    @Value("${spring.mail.properties.mail.debug}")
    private String debug;

    /**
     * Gmail Config
     */
//    @Value("${spring.mail.username}")
//    private String username;
//    @Value("${spring.mail.password}")
//    private String password;
//    @Value("${spring.mail.properties.mail.smtp.auth}")
//    private String auth;
//    @Value("${spring.mail.properties.mail.smtp.starttls.enable}")
//    private String starttls;

    @Bean
    public JavaMailSender javaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setDefaultEncoding(encoding);
        mailSender.setHost(host);
        mailSender.setPort(port);

        /**
         * Gmail Config
         */
//        mailSender.setUsername(username);
//        mailSender.setPassword(password);
        Properties properties = new Properties();
//        properties.put("mail.smtp.auth", auth);
//        properties.put("mail.smtp.starttls.enable", starttls);
        properties.put("mail.debug", debug);
        mailSender.setJavaMailProperties(properties);

        return mailSender;
    }





}

ThymeleafConfig:

public class ThymeleafConfig extends WebMvcConfigurerAdapter  {




    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setCharacterEncoding("UTF-8");
        viewResolver.setTemplateEngine( templateEngine());
        return viewResolver;
    }

    @Bean
    public ISpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        return templateEngine;
    }

    private ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setCacheable(false);
        templateResolver.setPrefix("classpath:/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        return templateResolver;
    }
}

我从这个例子中做到了:https://www.youtube.com/watch?v=KoPWOACk6CA

【问题讨论】:

    标签: spring spring-boot spring-mvc


    【解决方案1】:

    Spring 在尝试构建您的 KonsultacjaController 时抱怨,因为它找不到满足 MailComponent 依赖关系的 bean。从您包含的课程来看,它可能是以下两种情况之一:

    • 您的 spring 上下文没有 TemplateEngine 实例。您的 MailComponent 需要一个,如果您的上下文没有它,它将无法构造 MailController(因此无法构造 KonsultacjaController)。

    • Spring 组件扫描未找到您的 MailController 组件,因此它在上下文中不存在。

    顺便说一句,JavaMailSender 扩展了 MailSender,因此您不需要将两者都注入到 MailComponent 中。

    【讨论】:

    • 我需要添加 ScanComponent 吗?
    • 视情况而定。如果您使用的是 SpringBoot 并且您的组件与您的主类位于同一个包(或子包)中,那么您不需要。否则,您可能需要添加 @ComponentScan(basePackages = {"yourPackageHere", "another package here"}) 您确实需要在上下文中的某个位置有一个 TemplateEngine(没有它,没有任何扫描量会有所帮助;它需要构造 MailComponent)。
    • 不太明白,因为在MailComponent里面
    • 在MailComponent中使用。您将其声明为 Autowired。任何你想要 spring 连接的东西都需要由上下文提供。因此,您需要在配置类中使用 Bean 注释方法来构造并返回 am 实例。与您在 MailConfig bean 中为 JavaMailSender 所做的类似。
    • 一定要这样吗? @Bean public TemplateEngine templateEngine(){ TemplateEngine templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(thymeleafTemplateResolver());返回模板引擎; }
    【解决方案2】:

    正如@Chris 所建议的那样。

    查看 application.propertiesapplication.yml 文件。

    必须有如下图所示定义的键

    application.properties

    spring.mail.default-encoding=UTF-8
    

    application.yml

    spring
      mail
        default-encodig: UTF-8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多