【发布时间】:2021-03-25 10:02:52
【问题描述】:
你好 我正在使用 SpringBoot 创建一个 Web 应用程序,并且在相关代码中我允许单击一个按钮,该按钮从数据库中删除一个对象,然后向该对象的电子邮件地址发送一封电子邮件。在单击按钮时添加电子邮件部分之前,它工作得很好并且该行已从表中删除,但是现在我收到一个错误:
java.lang.IllegalStateException:没有为范围名称“重新启动”注册范围
我认为这与控制器中的上下文有关: 控制器:
@RequestMapping("/rejectApplicant")
@ResponseBody
public String rejectApplicant(@RequestParam String id, HttpServletRequest request, HttpServletResponse response, Model model) {
Long athleteID = Long.parseLong(id);
Optional<Athlete> optionalAthlete = athleteAuditor.findAthleteById(athleteID);
Athlete athlete = optionalAthlete.get();
AbstractApplicationContext context = new AnnotationConfigApplicationContext(
EmailConfig.class);
MailService mailService = context.getBean("mailService", MailServiceImp.class);
System.out.println("////// " + mailService.toString());
String senderEmailId = "Z@gmail.com";
String receiverEmailId = athlete.getEmail();
System.out.println("////// " + receiverEmailId);
String subject = "Your time at Lyons";
String message = "Dear " + athlete.getName() + "How goes it?";
mailService.sendEmail(senderEmailId, receiverEmailId, subject, message);
context.close();
athleteAuditor.deleteAthlete(athleteID);
return "applicants";
}
//配置
@Configuration
@ComponentScan(basePackages = "xda")
public class EmailConfig {
u/Bean
public JavaMailSender getMailSender()
{
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
// Using Gmail SMTP configuration.
mailSender.setHost("smtp.gmail.com");
mailSender.setPort(587);
/*
* Use your gmail id and password
*/
mailSender.setUsername("X@gmail.com");
mailSender.setPassword("Y");
Properties javaMailProperties = new Properties();
javaMailProperties.put("mail.smtp.starttls.enable", "true");
javaMailProperties.put("mail.smtp.auth", "true");
javaMailProperties.put("mail.transport.protocol", "smtp");
javaMailProperties.put("mail.debug", "true");
mailSender.setJavaMailProperties(javaMailProperties);
return mailSender;
}
}
//邮件服务介绍
@Service("mailService")
public class MailServiceImp implements MailService
{
u/Autowired
JavaMailSender mailSender;
public void sendEmail(final String senderEmailId, final String receiverEmailId,
final String subject, final String message)
{
MimeMessagePreparator prep = new MimeMessagePreparator()
{
public void prepare(MimeMessage mimeMessage) throws Exception
{
mimeMessage.setFrom(senderEmailId);
mimeMessage.setRecipient(Message.RecipientType.TO,
new InternetAddress(receiverEmailId));
mimeMessage.setSubject(subject);
mimeMessage.setText(message);
}
};
try
{
mailSender.send(prep);
System.out.println("Successfully sent message");
}
catch (Exception exe)
{
exe.printStackTrace();
}
}
}
//邮件服务
public interface MailService
{
public void sendEmail(final String senderEmailId, final String receiverEmailId,
final String subject, final String message);
}
抱歉代码这么多,我不知道是什么原因造成的,这是我第一次尝试使用 Spring-Boot-Starter-Mail,感谢您的帮助!
【问题讨论】:
-
如果您使用的是 Spring Boot,为什么要创建自己的
JavaMailSender而不是使用自动获得的那个? -
您的代码一开始就有缺陷。不要创建上下文来获取 bean,只需
@Autowire将其放入您的控制器中。删除@CompontScan并在使用 SPring Boot 时删除EmailConfig。
标签: java spring spring-boot email spring-boot-starter