自动装配的 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 管理,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);
}
}
请记住,DBClass
需要 线程安全 如果您要使用默认单例范围为其创建 Spring bean。
我正在创建一个简单的休息服务。 我有一个休息控制器 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 管理,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);
}
}
请记住,DBClass
需要 线程安全 如果您要使用默认单例范围为其创建 Spring bean。