【问题标题】:Why is spring-boot-starter-mail causing a context error?为什么 spring-boot-starter-mail 会导致上下文错误?
【发布时间】: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


【解决方案1】:

我认为问题出在@ComponentScan。我会检查@ComponentScan 是否只使用过一次。来自Baeldung Spring Component Scanning

在 Spring 中,我们使用 @ComponentScan 注解以及 @Configuration 注释来指定我们想要的包 扫描。不带参数的 @ComponentScan 告诉 Spring 扫描 当前包及其所有子包。

注意主应用类和配置类是 不一定相同。如果它们不同,那没关系 主要应用程序类的放置位置。只有位置 配置类很重要,因为组件扫描从它的 默认打包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 2017-05-12
    • 2015-04-01
    • 2014-12-29
    • 2020-05-23
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多