У меня есть класс конфигурации, в котором я устанавливаю свойства JavaMailSenderImpl
, но я хочу не устанавливать значения в @Bean
, а просто настроить их для получения с помощью методов (например: mailSender.setPort(ClassImpl.getPort());
). Ниже приведен код, и я пытался передать значения через геттеры, но получаю npe.
//properties.file
mail.host=the_host
mail.port=123
mail.username=the_username
mail.password=the_password
// ClassInterface has only one sendMail method
@Component
public class ClassImpl implements ClassInterface{
@Value("${mail.host}")
public String host;
@Value("${mail.port}")
private int port;
@Value("${mail.username}")
private String username;
@Value("${mail.password}")
private String password;
public String getHost() {
return host;
}
public int getPort() {
return port;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
@Autowired
JavaMailSenderImpl mailSender;
@Override
public void sendMail(String sender, String receiver, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(sender);
message.setTo(receiver);
message.setSubject(subject);
message.setText(content);
mailSender.send(message);
}
}
@Configuration
@ComponentScan
public class SpringConfiguration {
@Bean
public JavaMailSenderImpl mailSenderService() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(host_here);
mailSender.setPort(port_here);
mailSender.setUsername(user_here);
mailSender.setPassword(pwd_here);
return mailSender;
}
}
РЕДАКТИРОВАТЬ
попытался сделать этот getHost static
и передать метод следующим образом:
mailSender.setHost(ClassImpl.getHost());
// but I get the 'refused to connect' and it sets the value to 'localhost'
// and not to the value @Value host I need from properties.file
@zapl да, это сработало, я добавлю это как правильное решение.
Как прокомментировал zapl, я добавил ClassImpl в параметр @Bean, и он отлично работает.
@Bean
public JavaMailSenderImpl mailSenderService(ClassImpl ci) {
....
NPE, который вы получите, будет интересен, вероятно, потому, что вы используете что-то неправильно, так как теоретически это должно работать нормально. Также где используется ClassImpl или ClassInterface? Вы должны делать что-то вроде
@Bean public JavaMailSenderImpl mailSenderService(ClassInterface if) { ... mailSender.setHost(if.getHost())
- edit: spring не вводит в статическое поле. И поскольку у вас есть циклическая вещь между классом if и отправителем, возможно, разделите ClassInterface на config и фактического отправителя, чтобы в итоге вы получили sender < javamail < config вместо вашего круга.