springboot pointer component and java spring properties environment autowired

java - pointer - spring @autowired null value



El entorno autocableado es nulo (4)

Cambié la carga del método a este

public String load(String propertyName) { ApplicationContext context = new AnnotationConfigApplicationContext("my.pack.offer.*"); Environment e = context.getEnvironment(); boolean a = e.containsProperty(propertyName); return e.getRequiredProperty(propertyName); }

y eliminado @Autowired . Funciona, pero todavía no es como yo quiero.

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.


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 .


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); } }


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; }