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