El entorno autocableado es nulo

Tengo un problema con el entorno de conexión a mi proyecto Spring. En esta clase

@Configuration @ComponentScan(basePackages = "my.pack.offer.*") @PropertySource("classpath:OfferService.properties") public class PropertiesUtil { @Autowired private Environment environment; @Bean public String load(String propertyName) { return environment.getRequiredProperty(propertyName); } } 

el entorno siempre es nulo.

El autoenvío ocurre más tarde de lo que se llama load() (por alguna razón).

Una solución alternativa es implementar EnvironmentAware y confiar en el método Spring calling setEnvironment() :

 @Configuration @ComponentScan(basePackages = "my.pack.offer.*") @PropertySource("classpath:OfferService.properties") public class PropertiesUtil implements EnvironmentAware { private Environment environment; @Override public void setEnvironment(final Environment environment) { this.environment = environment; } @Bean public String load(String propertyName) { return environment.getRequiredProperty(propertyName); } } 

Cambie @Autowired for @Resource (de javax.annotation) y hágalo public por ejemplo:

 @Configuration @PropertySource("classpath:database.properties") public class HibernateConfigurer { @Resource public Environment env; @Bean public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(env.getProperty("database.driverClassName")); dataSource.setUrl(env.getProperty("database.url")); dataSource.setUsername(env.getProperty("database.username")); dataSource.setPassword(env.getProperty("database.password")); dataSource.setValidationQuery(env.getProperty("database.validationQuery")); return dataSource; } } 

Y debe registrar su clase de configuración en WebApplicationInitializer de esta manera

 AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(ApplicationConfigurer.class); //ApplicationConfigurer imports HibernateConfigurer 

¡Me funciona! Es posible que desee comprobar un proyecto de prueba que hice .

Por favor, ponga este código dentro de la clase en la que está tratando de autoconectar el entorno

 @Bean public static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } 

Solucionó mi problema. A continuación te doy mi clase.

 @Configuration @EnableTransactionManagement public class DatabaseConfig { /** * DataSource definition for database connection. Settings are read from the * application.properties file (using the env object). */ @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(env.getProperty("db.driver")); dataSource.setUrl(env.getProperty("db.url")); dataSource.setUsername(env.getProperty("db.username")); dataSource.setPassword(env.getProperty("db.password")); return dataSource; } @Bean public static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } @Autowired private Environment env; }