我正在创建一个简单的休息服务。 我有一个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邮件发件人对象。是什么原因呢?
感谢您的帮助。
答案 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管理,而JavaMailSender
是null
。
我建议为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
必须是线程安全的。