스프링 부트 - Environment @Autowired가 Null Pointer를 슬로우합니다.예외.
Spring Boot 0.5.0을 사용한 프로젝트 셋업이 있습니다.M5.
설정 파일 중 하나를 실행하려고 합니다.@Autowire Environment단, 이 경우 실패한다.NullPointerException.
지금까지의 내용은 다음과 같습니다.
어플.자바
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
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;
}
}
속성 파일에 구성된 데이터베이스 속성을 로드하려고 합니다.하지만, 그Environment삽입되지 않고 코드는 에 실패합니다.NullPointerExceptionXML 파일 설정은 없습니다.
구성한 속성 파일의 경우PropertySourcesPlaceholderConfigurer이 방법:
@Configuration
@PropertySource("classpath:database.properties")
public class PropertyConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
스와핑을 시도했습니다.@Autowired,@Resource그리고.@Inject지금까지 아무 것도 효과가 없었어요.어떤 도움이라도 주시면 감사하겠습니다.감사해요.
특정 문제는 해결되었지만, 봄의 자동 배선이 너무 늦게 발생할 경우에 대비하는 방법은 다음과 같습니다.
요령이란, 실장하는 것입니다.org.springframework.context.EnvironmentAware; 봄은 다음으로 환경을 통과한다.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");
// ...
}
}
이것은 보다 우아하지 않다.@Autowired또는@Value단, 상황에 따라서는 회피책으로 기능합니다.
Spring과 Spring의 라이프 사이클에 문제가 있었던 것 같습니다.EntityManagerFactory그 때문에, 그러한 것에 부딪혔을 가능성이 있습니다(4.0.0으로 수정).RC1) - 만약@Configuration클래스가 매우 일찍 인스턴스화되므로 자동 배선에 적합하지 않을 수 있습니다.로그 출력으로 알 수 있습니다.
그냥 궁금해서 물어본 건데, 여기서 제공하는 기능은JpaConfig그리고.PropertyConfig를 사용하는 경우는, 이미 개봉이 끝난 상태로 프리셋 되어 있습니다.@EnableAutoConfiguration(당신이 있는 한)@ComponentScan(저장소가 정의되어 있는 패키지)예에 대해서는, 「Spring Boot」의 JPA 샘플을 참조해 주세요.
스프링 배치에서도 같은 문제가 있었습니다.구성 클래스가 이전에 인스턴스화되었기 때문에 작성자가 환경 클래스를 자동 연결할 수 없습니다.그래서 저는 환경을 인스턴스화하기 위해 일종의 Singleton(구식 방식)을 만들었고 매번 액세스할 수 있었습니다.
이 실장을 실시했습니다.
@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;
}
}
그리고 그것은 동작한다.
스프링 부트 어플리케이션의 application.properties 파일에서 속성을 읽을 때도 같은 문제가 있었습니다.나는 문제를 파악하고 그것을 작동시키기 위해 많은 노력을 했다.드디어 다 했어요.속성 파일에서 속성 값을 읽는 상수 클래스입니다.누군가에게 도움이 되었으면 좋겠어요.
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");
}
}
이것들은 내 application.properties에 선언된 속성 키입니다.
spring.activemq.broker-host
spring.activemq.broker-port
spring.activemq.user
spring.activemq.password
언급URL : https://stackoverflow.com/questions/19454289/spring-boot-environment-autowired-throws-nullpointerexception
'programing' 카테고리의 다른 글
| 스프링 부트 상태가 세부 정보를 표시하지 않음(withDetail info) (0) | 2023.03.06 |
|---|---|
| 순환 참조가 있는 경우에도 DOM 노드를 JSON으로 시리얼화하려면 어떻게 해야 합니까? (0) | 2023.03.06 |
| Spring JPA Repository - jsonObject의 연산자 SIMPLE_PROPERTY에는 스칼라 인수가 필요합니다. (0) | 2023.03.06 |
| Mongoose에서 고유한 값을 쿼리하려면 어떻게 해야 합니까? (0) | 2023.03.06 |
| jQuery.getJSON - 접근컨트롤-허용-발신원 문제 (0) | 2023.03.06 |