Gavi
Gavi

Reputation: 1488

Spring Java Config. Use of PropertiesFactoryBean in the configuration file

I've the following configuration file

@Configuration
@ComponentScan(basePackages = "com.foo")
@EnableTransactionManagement
public class AppSpringConfiguration {

    @Autowired
    private Environment env;

    @Autowired
    private ApplicationContext appContext;

    @Value("#{cvlExternalProperties['dbDriverClassName']}")
    private String dbDriverName;

    @Bean
    public PropertiesFactoryBean cvlExternalProperties() {
        PropertiesFactoryBean res = new PropertiesFactoryBean();
        res.setFileEncoding("UTF-8");
        res.setLocation(new FileSystemResource(env.resolvePlaceholders("${MY_ENV_VAR}") + "external.properties"));
        return res;
    }

    @Bean
    public BasicDataSource datasource() {
        BasicDataSource basicDataSource = new BasicDataSource();
        basicDataSource.setDriverClassName("myDriverClassName");
        basicDataSource.setUrl("MyDbUrl");
        basicDataSource.setUsername("myUser");
        basicDataSource.setPassword("myPass");
        return basicDataSource;
    }
}

And in the external properties file I've

dbUrl=jdbc:mysql://localhost:3306/someDb
dbUser=someUser
dbPassword=somePass
dbDriverClassName=com.mysql.jdbc.Driver

In which way I can use the cvlProperties inside the datasource() method? I've tried

env.getProperty("dbDriverClassName")
env.getProperty("#cvlProperties['dbDriverClassName']")

But I'm not able to retrieve the properties. The field dbDriverName is correctly filled, so that means the bean declaration is ok. I want to use the PropertyFactoryBean class because in this way I can specify the encoding to use.

If I use the the following annotation on the top of the configuration class

@PropertySource("file:${MY_ENV_VAR}/external.properties")

I'm able to retrieve the properties with this piece of code

env.getProperty("dbDriverClassName")

But the encoding used by the PropertySource annotation is the windows default, and for me is not correct.

Can you help me?

Upvotes: 2

Views: 3751

Answers (1)

Gavi
Gavi

Reputation: 1488

At the moment the solution(that I don't love so much) is to declare the properties by using the annotation @Value

@Value("#{cvlExternalProperties['dbDriverClassName']}")
private String dbDriverClassName;

and then using it inside the java class

Upvotes: 1

Related Questions