自动装配的 JavaMailSender 对象抛出空指针异常,RestController 除外 Class

Autowired JavaMailSender Object Throws Null Pointer Exception Except RestController Class

我正在创建一个简单的休息服务。 我有一个休息控制器 class,它有一个 post 映射端点“/插入”:

    @RestController
    @RequestMapping("/restapi")
    public class RestService{

        @PostMapping("/insert")
        public void insert(@RequestBody String body){
            DBClass db = new DBClass();
            db.insert(body);
        }

    }

我有一个名为 DBClass 的 class,它连接到数据库并插入对象。但如果失败,它会发送一封关于错误的电子邮件。这是插入方法:

public void insertToFirestore(String body) {

        try {
            //insertDB
        } catch (Exception e) {
            MailService ms = new MailService();
            ms.sendMail(to,subject,text);
        }

    }

还有一个 MailService class,我可以在其中处理邮件。它有一个名为 sendMail 的方法:

@Component
public class MailService {

    @Autowired
    JavaMailSender jms;

    public void sendMail(String to,String subject,String text) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        jms.send(message);
    }
}

我已经在application.properties文件中完成了配置。因此,如果我尝试在其余控制器 class 中发送邮件,它工作得很好,但是当我尝试在 MailService class 中发送邮件时,Javamailsender 对象抛出空指针异常。我还尝试发送 Rest Controller 以外的邮件 class,它们都抛出相同的异常。

@Autowired 关键字仅在 Rest Controller class 中初始化 java 邮件发件人对象。这是什么原因?

感谢任何帮助。

当使用 new 关键字初始化 class 时,自动装配将不起作用。在您的情况下,您正在使用 new 关键字初始化 MailService,这就是为什么它不会在其中自动装配 JavaMailSender

您可以尝试以下有效的代码 -

@Component
class DBClass {
    @Autowired
    private MailService ms;
    public void insertToFirestore(String body) {

        try {
            //insertDB
        } catch (Exception e) {
            ms.sendMail(to,subject,text);
        }

    }
}


@RestController
@RequestMapping("/restapi")
public class RestService{
@Autowired
private DBClass db;
    @PostMapping("/insert")
    public void insert(@RequestBody String body){
        db.insert(body);
    }

}

问题是您使用 new DBClass() 实例化 DBClass 对象,而不是创建 Spring bean 并将其注入 RestService。 因此 DBClass 实例不受 Spring 管理,JavaMailSendernull.

我建议为 DBClass 创建一个 bean 并在 RestService.

中自动装配它

例如:

@RestController
@RequestMapping("/restapi")
public class RestService {

    @Autowired
    private DBClass db;

    @PostMapping("/insert")
    public void insert(@RequestBody String body){
        db.insert(body);
    }

}

请记住,DBClass 需要 线程安全 如果您要使用默认单例范围为其创建 Spring bean。