Не удалось autowire org.springframework.mail.javamail.JavaMailSender
У меня возникла следующая проблема при попытке запустить мое приложение. Отлаживали все и все еще ничего.
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: {}
My 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;
}
}
}
Справка действительно оценена.
Ответы
Ответ 1
В соответствии с комментарием от mserioli ответ заключается в том, что bean должен быть объявлен в файле конфигурации, который вызывается у root.
В этом случае:
Переместить
@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
Возможно, вы забыли установить следующие свойства:
spring.mail.host
spring.mail.username
spring.mail.password
spring.mail.port
Ответ 3
-
проверьте конфигурацию application.properties, например:
spring.mail.host=smtp.xxx.com
[email protected]
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 эту аннотацию
Ответ 4
Вы пытались объявить свой bean возврат интерфейса реализованным? Что-то вроде этого:
@Bean
public JavaMailSender mailSender() {
Ответ 5
Объявляя боб так:
@Bean
public JavaMailSender emailSender(){
return new JavaMailSenderImpl();
}
вам также нужно установить свойства bean-компонента вручную, что, на мой взгляд, не ваша цель.
Чтобы использовать возможности автоконфигурации Spring, просто аннотируйте приложение DemoMailConnectionApplication с помощью @EnableAutoConfiguration
и удалите явное объявление @Bean
.
Ваш класс DemoEmailConnectionApplication
должен выглядеть намного проще, например так:
@SpringBootApplication
@EnableAutoConfiguration
public class DemoEmailConnectionApplication {
public static void main(String[] args) {
SpringApplication.run(DemoEmailConnectionApplication.class, args);
}
}
Позже вы столкнетесь с другим исключением, поскольку сообщение установлено неправильно, но проблема с подключением будет решена.