繁体   English   中英

在Spring Boot中无法自动装配Java线程中的bean

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM