尝试运行我的应用程序时出现以下问题。调试了一切,但仍然没有。
IDE正在寻找没有任何问题的bean,所以我对这里发生的事情感到很困惑。
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mailManager': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.testmail.app.service.implement.CustomMManagerService.setMailSender(org.springframework.mail.javamail.JavaMailSender); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.mail.javamail.JavaMailSender] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
我的bean生成位于以下文件中:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.testmail.app")
public class WebConfig extends WebMvcConfigurerAdapter {
//CODE CODE CODE
@Bean
public JavaMailSenderImpl mailSender() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setProtocol("SMTP");
javaMailSender.setHost("127.0.0.1");
javaMailSender.setPort(25);
return javaMailSender;
}
// CODE CODE CODE
}
CustomMManager的代码:
public interface CustomMManager extends Serializable {
void sendMail(String mailFrom,String mailTo,String subject,String mailBody);
}
最后是CustomMManagerService的代码:
@Service("mailManager")
public class CustomMManagerService implements CustomMManager {
private JavaMailSender mailSender;
@Autowired
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
@Override
public void sendMail(final String mailFrom, final String mailTo, final String subject, final String mailBody) {
try {
mailSender.send(new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage)
throws Exception {
MimeMessageHelper message = new MimeMessageHelper(mimeMessage,
false, "UTF-8");
message.setFrom(mailFrom);
message.addTo(mailTo);
message.setSubject(subject);
message.setText(mailBody, true);
}
});
} catch (MailSendException e) {
// your codes;
}
}
}
非常感谢帮助。
答案 0 :(得分:40)
您可能忘记设置以下属性:
spring.mail.host
spring.mail.username
spring.mail.password
spring.mail.port
答案 1 :(得分:8)
根据mserioli的评论,答案是必须在root用户调用的配置文件中声明bean。
在这种情况下: 移动
@Bean
public JavaMailSenderImpl mailSender()
到
public class ExtraConfig {
@Bean
public JavaMailSenderImpl mailSender() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setProtocol("SMTP");
javaMailSender.setHost("127.0.0.1");
javaMailSender.setPort(25);
return javaMailSender;
}
}
在:
中调用@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{ExtraConfig.class};
}
从而解决问题。谢谢你的帮助。
答案 2 :(得分:7)
检查application.properties配置,例如:
spring.mail.host=smtp.xxx.com
spring.mail.username=xxx@xxx.com
spring.mail.password=xxxxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
如果你使用spring-boot,可以检查是否应该使用@EnableAutoConfiguration这个注释
答案 3 :(得分:2)
如上所述,您需要在应用程序属性中至少设置spring.mail.host
。如果设置了属性https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderPropertiesConfiguration.java#L38
JavaMailSender
bean。
答案 4 :(得分:1)
在 application.properties 中配置spring.mail相关的属性足以完成JavaMailSender的自动装配。在我们的例子中,有人也有Bean声明,因此它优先于application.properties。因此,Autowired没有显示。希望对您有所帮助。
答案 5 :(得分:1)
如果您使用 application.yml
而不是 application.properties
进行配置,请仔细检查您的缩进(YAML 中的结构由缩进决定)
在您的情况下,mail:
应该在 spring:
下,如下所示:
spring:
datasource:
password: root
url: jdbc:mysql://127.0.0.1:3306/YOU_DATABASE?useSSL=false
username: root
mail:
host: localhost
port: 1025
username:
password:
properties:
mail:
smtp:
ssl:
trust: "*"
auth: true
starttls:
enable: true
connectiontimeout: 5000
timeout: 3000
writetimeout: 5000
答案 6 :(得分:0)
您是否尝试声明bean返回实现的接口?像这样:
@Bean
public JavaMailSender mailSender() {
答案 7 :(得分:0)
创建Bean时不要忘记使用Java类或在application.properties文件中指定邮件属性
# configuration email
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=email
spring.mail.password=password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
答案 8 :(得分:0)
就我而言,我删除了一些内容,但我的项目未显示为maven项目。 (我在我的Spring Boot应用程序中使用IntelliJ)
将项目设置为 maven项目 (关闭并重新打开IntelliJ。它将显示弹出窗口)解决了该问题。