[英]Failed to Autowire beans in a Java thread in Spring Boot
我成功地为bean进行了自动接线,并使用以前的代码发送了电子邮件。 代码如下:
public class HomeController{
@Autowired
private MailConstructor mailConstructor;
@Autowired
private JavaMailSender mailSender;
...
String token = UUID.randomUUID().toString();
String appUrl = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
SimpleMailMessage newEmail = mailConstructor.constructResetTokenEmail(appUrl, request.getLocale(), token, user);
mailSender.send(newEmail);
...
}
现在,我想在一个新线程中发送电子邮件,并且我引用此链接编写了代码: 为什么自动装配在线程中不起作用? 我的新代码如下:
public class EmailUtility {
@Autowired
private JavaMailSender mailSender;
public static SimpleMailMessage constructNormalEmail(String text, String subject, String toAddress, String fromAddr) {
SimpleMailMessage email = new SimpleMailMessage();
email.setTo(toAddress);
email.setSubject(subject);
email.setText(text);
email.setFrom(fromAddr);
return email;
}
public class SendEmail implements Runnable{
private String subject;
private String text;
private String toAddr;
private String fromAddr;
public SendEmail(String subject, String text, String toAddr, String fromAddr){
this.subject = subject;
this.text = text;
this.toAddr = toAddr;
this.fromAddr = fromAddr;
}
@Override
public void run() {
SimpleMailMessage email = constructNormalEmail(text, subject, toAddr, fromAddr);
mailSender.send(email);
}
}
}
但我收到以下错误:
exception in thread "Thread-5" java.lang.NullPointerException
此错误和IntelliJ呈现的消息均无法自动接线。 找不到“ JavaMailSender”类型的bean表示自动装配失败。
该错误的可能原因是什么,如何在线程中自动装配bean? 任何建议将不胜感激。
=============================更新==================== =================在这些家伙的帮助下解决了这个问题。 问题是我自己创建了EmailUtility。 我以前的代码如下:
//Wrong Version
Thread sendEmailThread = new Thread(new EmailUtility().new SendEmail(subject, text, toAddress, fromAddress));
如果我让Spring自动装配EmailUtility,则代码可以正常工作:
//Correct Version
@Component
public class EmailUtility {
......
}
public class HomeController{
@Autowired
private EmailUtility emailUtility;
...
Thread sendEmailThread = new Thread(emailUtility.new SendEmail(subject, text, toAddress));
...
}
EmailUtility
很可能不是由Spring创建的,因为它没有标记为@Service
@Controller
, @Service
@Component
, @Controller
@Component
, @Controller
@Inject
等。这就是为什么Spring框架没有机会将JavaMailSender
的实现注入(自动装配)到EmailUtility
实例中。
Spring使用由某种模式命名的类做一些魔术,因此*Controller
类可能被Spring识别为bean,但*Utility
类却不。
您的EmailUtility
很可能不是Spring托管的bean。 考虑将注释@Component
添加到EmailUtility
或在您的配置类中声明一个相应的bean。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.