2016-05-24 1 views
1

У меня есть небольшая проблема с помощью JavaMailSenderImpl для отправки писем в моем приложении загрузки.Ошибка автозапуска JavaMailSenderImpl, если spring.mail.host не в application.properties

Я пытаюсь установить все свойства динамически (я хочу, чтобы их читали из БД в будущем), но по неизвестным мне причинам автозапуск JavaMailSenderImpl работает только в том случае, если «spring.mail.host» присутствует в мои приложения.properties.

Не имеет значения, какое значение я устанавливаю (оно может быть пустым, это не имеет значения, потому что я устанавливаю правильный позже), но свойство должно быть там, или автоустановка не удастся.

Это мой контроллер:

import java.util.Properties; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.mail.MailException; 
import org.springframework.mail.SimpleMailMessage; 
import org.springframework.mail.javamail.JavaMailSenderImpl; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 


@Controller 
public class MailController { 

    @Autowired 
    private JavaMailSenderImpl ms; 


    @RequestMapping("/mail") 
    public String send(Model model){ 

     SimpleMailMessage message; 
     String fromEmail="[email protected]"; 
     String toEmail ="xxxxxxx"; 

     Properties mailProperties = new Properties(); 
     mailProperties.put("mail.smtp.starttls.enable", true); 
     mailProperties.put("mail.smtp.ssl.trust", "smtp.gmail.com"); 

     ms.setHost("smtp.gmail.com"); 
     ms.setPort(587); 
     ms.setUsername("xxxx"); 
     ms.setPassword("yyyyy"); 
     ms.setJavaMailProperties(mailProperties); 

     message = new SimpleMailMessage(); 
     message.setSubject("Test email"); 
     message.setFrom(fromEmail); 
     message.setTo(toEmail); 
     message.setText("Something something"); 

     try{ 
      ms.send(message); 
     } 
     catch(MailException ex){ 
      System.err.println(ex.getMessage()); 
     } 
     return "OK"; 
    } 

} 

будет работать нормально (отправляет по электронной почте) с этим application.properties:

#springboot-starter-mail properties 
spring.mail.host= 

Но выбросит это исключение, если я удалить эту строку:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.mail.javamail.JavaMailSenderImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    ... 19 common frames omitted 

Я мог оставить здесь пустое имущество, но он не чувствует себя хорошо.

Любые идеи, что может быть причиной?

+1

Триггер для создания 'JavaMailSenderImpl' - это свойство' spring.mail.host'. Не быть чем-то другим пустым. И то, что вы делаете, - это то, что вы не должны делать в первую очередь. Если вы хотите, чтобы ваша конфигурация была из базы данных, сделайте это, но не перенастраивайте компоненты во время выполнения. Загрузите все свойства при запуске (создайте реализацию PropertySource, управляемую Jdbc), и пусть весна сделает инъекцию для вас. Также почему база данных? Почему бы не создать конфигурацию весеннего облака или что-то еще. –

+0

@ M.Deinum Большое спасибо за объяснение, я не знал, что это был триггер. Это приложение, которое позволит пользователям отправлять письма, используя свои учетные записи электронной почты. Эта информация будет сохранена в базе данных для каждого пользователя, и поэтому я устанавливаю свойства «на лету». Я не знаю, есть ли лучшее решение для этого случая, я не эксперт, поэтому любые предложения заслуживают высокой оценки. –

ответ

2

Autwire интерфейс JavaMailSender вместо реализации.

@Autowired 
private JavaMailSender mailSender; 
+0

Как настроить хост, порт, имя пользователя и т. Д. Динамически с помощью JavaMailSender? –

1

Не автоувеличивайте JavaMailSenderImpl. Вместо этого создайте метод, который создает и экземпляр JavaMailSenderImpl, и возвращает его со всеми необходимыми параметрами. А затем позвоните своему почтовому отправителю, где вам это нужно. Если вы autowire mailsender, он вводит экземпляр, которому уже нужен параметр spring.mail.host.

Смежные вопросы