У меня есть небольшая проблема с помощью 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
Я мог оставить здесь пустое имущество, но он не чувствует себя хорошо.
Любые идеи, что может быть причиной?
Триггер для создания 'JavaMailSenderImpl' - это свойство' spring.mail.host'. Не быть чем-то другим пустым. И то, что вы делаете, - это то, что вы не должны делать в первую очередь. Если вы хотите, чтобы ваша конфигурация была из базы данных, сделайте это, но не перенастраивайте компоненты во время выполнения. Загрузите все свойства при запуске (создайте реализацию PropertySource, управляемую Jdbc), и пусть весна сделает инъекцию для вас. Также почему база данных? Почему бы не создать конфигурацию весеннего облака или что-то еще. –
@ M.Deinum Большое спасибо за объяснение, я не знал, что это был триггер. Это приложение, которое позволит пользователям отправлять письма, используя свои учетные записи электронной почты. Эта информация будет сохранена в базе данных для каждого пользователя, и поэтому я устанавливаю свойства «на лету». Я не знаю, есть ли лучшее решение для этого случая, я не эксперт, поэтому любые предложения заслуживают высокой оценки. –