Не удалось 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);
    }
}

Позже вы столкнетесь с другим исключением, поскольку сообщение установлено неправильно, но проблема с подключением будет решена.