Передать значения @Value в класс Config

У меня есть класс конфигурации, в котором я устанавливаю свойства 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

NPE, который вы получите, будет интересен, вероятно, потому, что вы используете что-то неправильно, так как теоретически это должно работать нормально. Также где используется ClassImpl или ClassInterface? Вы должны делать что-то вроде @Bean public JavaMailSenderImpl mailSenderService(ClassInterface if) { ... mailSender.setHost(if.getHost()) - edit: spring не вводит в статическое поле. И поскольку у вас есть циклическая вещь между классом if и отправителем, возможно, разделите ClassInterface на config и фактического отправителя, чтобы в итоге вы получили sender < javamail < config вместо вашего круга.

zapl 12.06.2019 09:48

@zapl да, это сработало, я добавлю это как правильное решение.

lpkej 12.06.2019 09:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как прокомментировал zapl, я добавил ClassImpl в параметр @Bean, и он отлично работает.

@Bean
public JavaMailSenderImpl mailSenderService(ClassImpl ci) {
....

Другие вопросы по теме