Аннотация Value в Spring не внедряет проперти

112
26 апреля 2019, 06:50

Есть два класса

PersistenceConfig:

@Configuration
@PropertySource("classpath:application.properties")
public class PersistenceConfig {
@Autowired
private DataSource dataSource;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Bean
public DriverManagerDataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}
//...

MailConfig:

@Configuration
@PropertySource("classpath:application.properties")
public class MailConfig {
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
@Value("${spring.mail.port}")
private int port;
@Value("${spring.mail.protocol}")
private String protocol;
@Value("${mail.debug}")
private String debug;
@Bean
public JavaMailSender javaMailSender() {
    JavaMailSenderImpl mailSenderImpl = new JavaMailSenderImpl();
    mailSenderImpl.setHost(host);
    mailSenderImpl.setPort(port);
    mailSenderImpl.setUsername(username);
    mailSenderImpl.setPassword(password);
    Properties properties = mailSenderImpl.getJavaMailProperties();
    properties.setProperty("mail.transport.protocol", protocol);
    properties.setProperty("mail.debug", debug);
    return mailSenderImpl;
}

А проблема в том, что в MailConfig параметры спокойно цепляются из файла application.properties, а в PersistenceConfig все переменные инициализируются все равно null'ами, хотя среда разработки вроде как видит эти параметры. Может сталкивался кто с таким.

Answer 1

В общем забавная штука. Если ставить

@Autowired private DataSource dataSource; 

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

@Value("${spring.mail.host}")
private String host;

инициализируется строкой "${spring.mail.host}", а не тем, что лежит в проперти по этой ссылке. Почему? А вот оказывается некоторые бины влияют на это. У меня в этом же классе лежал бин

@Bean 
public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() { 
    return new PersistenceExceptionTranslationPostProcessor(); 
} 

И если его убрать в другой класс, то переменные инициализируются верно. Логического объяснения этому у меня пока нет. Наверняка где-то в документации это описано.

READ ALSO
How to sort Map by Key, but with two conditions in Java?

How to sort Map by Key, but with two conditions in Java?

У меня есть проблема в сортировке MapИмеется LinkedHashMap с ключами типа "September-2018", "October-2018", "November-2017", "November-2018"

121
Что в Java является константой, а что - нет?

Что в Java является константой, а что - нет?

До недавнего времени я был почти на 100% убеждён в том, что прекрасно понимаю сущность констант в языке программирования JavaТак было, пока я не наткнулся...

120
Тестирование исключений

Тестирование исключений

У меня имеется метод:

164
Есть такой сервис, куда можно выложить код, и где любой желающий сможет его сразу запустить?

Есть такой сервис, куда можно выложить код, и где любой желающий сможет его сразу запустить?

Хочу протестить свой кодЛично я ошибок не нахожу(почти), другие люди находят

158