除RestController类外,自动连线的JavaMailSender对象引发空指针异常

时间:2018-10-28 14:08:13

标签: java spring javamail autowired

我正在创建一个简单的休息服务。 我有一个rest控制器类,该类具有一个后映射端点“ / insert”:

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

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

    }

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

public void insertToFirestore(String body) {

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

    }

这里有一个MailService类,负责处理邮件。它有一个叫做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文件中完成了配置。因此,如果我尝试在rest控制器类中发送邮件,则效果很好,但是当我尝试在MailService类中发送邮件时,Javamailsender对象将引发空指针异常。我还尝试发送除Rest Controller类之外的其他邮件,它们都引发了相同的异常。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用new关键字初始化类时,自动接线将不起作用。在这种情况下,您要使用MailService关键字初始化new,这就是为什么它不会自动装配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);
    }

}

答案 1 :(得分:1)

问题在于您正在使用DBClass实例化new 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);
    }

}

请记住,如果要使用默认的单例作用域为其创建Spring bean,则DBClass必须是线程安全的