Spring Boot - Environment @Autowired lève NullPointerException
J'ai un projet d'installation à l'aide de Printemps de Démarrage 0.5.0.M5.
Dans un des fichiers de configuration, je suis en train de @Autowire Environment
mais qui échoue avec une NullPointerException
.
Voici ce que j'ai à ce jour:
Application.java
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
JpaConfig.java où je suis en train de @Autowire Environment
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.ui.persistence.repository")
public class JpaConfig {
private static final String DATABASE_DRIVER = "db.driver";
private static final String DATABASE_PASSWORD = "db.password";
private static final String DATABASE_URL = "db.url";
private static final String DATABASE_USERNAME = "db.username";
private static final String HIBERNATE_DIALECT = "hibernate.dialect";
private static final String HIBERNATE_SHOW_SQL = "hibernate.show_sql";
private static final String ENTITYMANAGER_PACKAGES_TO_SCAN
= "entitymanager.packages.to.scan";
@Autowired
private Environment env;
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty(DATABASE_DRIVER));
dataSource.setUrl(env.getProperty(DATABASE_URL));
dataSource.setUsername(env.getProperty(DATABASE_USERNAME));
dataSource.setPassword(env.getProperty(DATABASE_PASSWORD));
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean
= new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPersistenceProviderClass(
HibernatePersistence.class);
entityManagerFactoryBean.setPackagesToScan(
env.getProperty(ENTITYMANAGER_PACKAGES_TO_SCAN));
entityManagerFactoryBean.setJpaProperties(hibernateProperties());
return entityManagerFactoryBean;
}
}
Je suis en train de charger la base de données de propriétés configurées dans un fichier de propriétés. Cependant, la Environment
n'est pas injecté et le code ne fonctionne pas avec NullPointerException
. Je n'ai pas de configuration dans des fichiers XML.
Pour le fichier de propriétés, j'ai configuré PropertySourcesPlaceholderConfigurer
de cette façon:
@Configuration
@PropertySource("classpath:database.properties")
public class PropertyConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
J'ai essayé de permutation @Autowired
@Resource
et @Inject
mais rien n'a fonctionné jusqu'à présent. Serais reconnaissant de toute aide. Merci.
source d'informationauteur imme
Vous devez vous connecter pour publier un commentaire.
Je crois qu'il y avait certains de cycle de vie les problèmes avec le Printemps et le
EntityManagerFactory
et vous pourriez avoir enfreint ces (corrigé dans la 4.0.0.RC1) - si votre@Configuration
classe est instanciée super tôt, il pourrait ne pas être admissible à permettra à l'autowiring. Vous pouvez probablement dire à partir de la sortie du journal, si c'est le cas.Juste par intérêt, saviez-vous que la fonctionnalité fournie par votre
JpaConfig
etPropertyConfig
est déjà presetn hors de la boîte si vous utilisez@EnableAutoConfiguration
(aussi longtemps que vous@ComponentScan
que le paquet où vos dépôts sont définis)? Voir la Exemple JPA au Printemps de Démarrage pour un exemple.Si votre problème est résolu, voici comment obtenir
Environment
dans le cas du Printemps permettra à l'autowiring arrive trop tard.L'astuce est de mettre en œuvre
org.springframework.context.EnvironmentAware
; Printemps, puis passe à l'environnement àsetEnvironment()
méthode.Cela fonctionne depuis le Printemps 3.1.
Un exemple:
Ce n'est pas aussi élégant que
@Autowire
ou@Value
mais il fonctionne comme solution de contournement dans certaines situations.J'ai eu le même problème sur Spring Batch. Les écrivains ne peuvent pas autowire de l'Environnement de la classe à cause de la Configuration de la classe a été instancié plus tôt.
J'ai donc créé une sorte de Singleton (ancienne) pour instancier l'Environnement et j'ai pu accéder à tous les temps.
J'ai fait cette mise en œuvre :
}
Et il fonctionne