imm*_*mme 17 java environment nullpointerexception autowired spring-boot
我使用Spring Boot 0.5.0.M5进行项目设置.
在我尝试的其中一个配置文件中,@Autowire Environment但是失败了NullPointerException.
这是我到目前为止所拥有的:
Application.java
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
JpaConfig.java我想去的地方@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;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试加载属性文件中配置的数据库属性.但是,Environment没有注入,代码失败了NullPointerException.我在XML文件中没有任何配置.
对于我以PropertySourcesPlaceholderConfigurer这种方式配置的属性文件:
@Configuration
@PropertySource("classpath:database.properties")
public class PropertyConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
Run Code Online (Sandbox Code Playgroud)
我试图交换@Autowired,@Resource并且@Inject但至今没有奏效.非常感谢任何帮助.谢谢.
Ale*_*rov 24
虽然您的具体问题已经解决,但是如何避免EnvironmentSpring的自动装配发生得太晚.
诀窍是实施org.springframework.context.EnvironmentAware; 然后Spring将环境传递给setEnvironment()方法.这适用于Spring 3.1.
一个例子:
@Configuration
@PropertySource("classpath:myProperties.properties")
public class MyConfiguration implements EnvironmentAware {
private Environment environment;
@Override
public void setEnvironment(final Environment environment) {
this.environment = environment;
}
public void myMethod() {
final String myPropertyValue = environment.getProperty("myProperty");
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这并不像@Autowired或那样优雅@Value,但在某些情况下它可以解决方法.
我在从 Spring Boot 应用程序中的 application.properties 文件中读取属性时遇到了类似的问题。为了找出问题并使其发挥作用,我付出了很多努力。最后我完成了。这是我的 Constants 类,它将从属性文件中读取属性值。我希望它会对某人有所帮助。
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.Environment;
@Configuration
@PropertySource("classpath:application.properties")
public class Constants implements EnvironmentAware {
static Environment environment;
@Override
public void setEnvironment(Environment environment) {
Constants.environment = environment;
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
public static String getActiveMQHost() {
System.out.println(environment.getProperty("spring.activemq.broker-host"));
return environment.getProperty("spring.activemq.broker-host");
}
public static String getActiveMQPort() {
System.out.println(environment.getProperty("spring.activemq.broker-port"));
return environment.getProperty("spring.activemq.broker-port");
}
public static String getActiveMQUser() {
System.out.println(environment.getProperty("spring.activemq.user"));
return environment.getProperty("spring.activemq.user");
}
public static String getActiveMQPassword() {
System.out.println(environment.getProperty("spring.activemq.password"));
return environment.getProperty("spring.activemq.password");
}
}
Run Code Online (Sandbox Code Playgroud)
这些是我的 application.properties 中声明的属性键,
spring.activemq.broker-host
spring.activemq.broker-port
spring.activemq.user
spring.activemq.password
Run Code Online (Sandbox Code Playgroud)
我相信Spring和它们存在一些生命周期问题EntityManagerFactory,你可能会对那些问题(在4.0.0.RC1中修复) - 如果你的@Configuration类超级实例化,它可能没有资格进行自动装配.您可以从日志输出中判断出是否是这种情况.
只是出于兴趣,你知道的功能由您提供的JpaConfig,并PropertyConfig已经presetn开箱即用的,如果你使用@EnableAutoConfiguration(只要您@ComponentScan在您的存储库中定义的包)?有关示例,请参阅Spring Boot中的JPA示例.
小智 5
我在 Spring Batch 上遇到了同样的问题。编写器无法自动装配 Environment 类,因为 Configuration 类较早实例化。所以我创建了一种单例(旧方式)来实例化环境,我每次都可以访问它。
我做了这个实现:
@Configuration
@PropertySource(value = { "classpath:kid-batch.properties" }, ignoreResourceNotFound = false)
public class BatchConfiguration implements EnvironmentAware {
private static Environment env;
public static String getProperty(String key) {
return env.getProperty(key);
}
@Override
public void setEnvironment(Environment env) {
BatchConfiguration.env = env;
}
Run Code Online (Sandbox Code Playgroud)
}
它有效
| 归档时间: |
|
| 查看次数: |
47306 次 |
| 最近记录: |