2017-01-07 3 views
0
@SpringBootApplication 
public class DataProcessorApplication { 
    public static void main(String[] args) throws UnknownHostException { 
    SpringApplication app = new SpringApplication(DataProcessorApplication.class); 
    app.run(); 
} 

포스트 프로세서 클래스봄 부팅 콩 널 (null) 예외

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
public class BeanRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { 

    private static final Logger LOG = LoggerFactory.getLogger(BeanRegistryPostProcessor.class); 

    @Autowired 
    private DataConfigurationService dataConfigurationService; 

    @Override 
    public void postProcessBeanFactory(final ConfigurableListableBeanFactory factory) 
     throws BeansException { 
    // we don't want to touch existing beans 
    } 

    @Override 
    public void postProcessBeanDefinitionRegistry(final BeanDefinitionRegistry registry){ 
    dataConfigurationService.something(); // service bean is null here 
    } 
} 

내 서비스 클래스

@Service 
public class DataConfigurationService implements ApplicationListener<ApplicationReadyEvent> { 

    private static final Logger LOG = LoggerFactory.getLogger(DataConfigurationService.class); 

    @Override 
    public void onApplicationEvent(final ApplicationReadyEvent e) { 
    LOG.debug("Loading active DataConfiguration instance..."); 
    } 
} 

예외

java.lang.NullPointerException: null 
    at dataprocessor.configmodels.processor.BeanRegistryPostProcessor.postProcessBeanDefinitionRegistry(BeanRegistryPostProcessor.java:40) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118) 
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:685) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:523) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:736) 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) 
    at dataprocessor.DataProcessorApplication.main(DataProcessorApplication.java:47) 

2017-01-07 12:42:47.802 WARN 8880 --- [   main] ationConfigEmbeddedWebApplicationContext : Exception thrown from LifecycleProcessor on context close 

java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: org.springframework.boot[email protected]7a138fc5: startup date [Sat Jan 07 12:42:46 CET 2017]; root of context hierarchy 
    at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:416) 
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1004) 
    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:963) 
    at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:793) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:324) 
    at dataprocessor.DataProcessorApplication.main(DataProcessorApplication.java:47) 

2017-01-07 12:42:47.803 ERROR 8880 --- [   main] o.s.b.f.s.DefaultListableBeanFactory  : Destroy method on bean with name 'org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory' threw an exception 

java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot[email protected]7a138fc5: startup date [Sat Jan 07 12:42:46 CET 2017]; root of context hierarchy 
    at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:403) 
    at org.springframework.context.support.ApplicationListenerDetector.postProcessBeforeDestruction(ApplicationListenerDetector.java:97) 
    at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:233) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:951) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:958) 
    at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1035) 
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1011) 
    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:963) 
    at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:793) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:324) 
    at dataprocessor.DataProcessorApplication.main(DataProcessorApplication.java:47) 

POM

,536,913,632 애플리케이션 구성 자동 검출 된 클래스 ( @Component, @Service 등) 빈 정의 만들고 BeanDefinitionRegistry에 등록된다에 기초

먼저 10

<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>2.0.0.BUILD-SNAPSHOT</version> 
     <relativePath /> <!-- lookup parent from repository --> 
    </parent> 

답변

0

스프링은 다음 순서로 컨텍스트를 초기화한다.

그런 다음 Spring 정의에 BeanFactoryPostProcessor을 구현하는 bean을 자동 감지하고 다른 bean이 작성되기 전에 적용합니다. BeanRegistryPostProcessorBeanFactoryPostProcessor 구현이므로이 단계에서 적용됩니다.

그런 다음 Spring은 BeanPostProcessor 인터페이스를 구현하는 모든 빈을 자동으로 감지하여 이후 생성 된 모든 빈에 적용합니다. 이 콩 중 하나는 @Autoware 주석을 처리하는 AutowiredAnnotationBeanPostProcessor입니다. 즉, 귀하의 서비스가이 단계에서 주입 될 것입니다.

너가 에 주입되기 전에 너는 DataConfigurationService 콩을 사용하려고 노력하는 것을 본다. 당신이 다음 BeanRegistryPostProcessorApplicationContextAware 인터페이스를 구현하고 있습니다이 문제를 해결하기 위해 애플리케이션 컨텍스트에서 직접 서비스의 인스턴스를 얻을 : 소위 컨테이너 확장에 대한

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
public class BeanRegistryPostProcessor 
    implements BeanDefinitionRegistryPostProcessor, ApplicationContextAware{ 

    private ApplicationContext applicationContext; 

    ... 

    @Override 
    public void postProcessBeanDefinitionRegistry(final BeanDefinitionRegistry registry){ 
     DataConfigurationService service = applicationContext.getBean(DataConfigurationService.class); 
     service.something(); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     this.applicationContext = applicationContext;    
    } 
} 

자세한 내용을 당신이 봄 documentation에서 찾을 수 가리 킵니다.

+0

따라서 구성을 서비스 용으로 변경하면 문제가 해결됩니까? –

+0

@SaurabhKumar 아니요. 왜냐하면 어쨌든'@ Autowired' 어노테이션은'BeanRegistryPostProcessor'가 적용된 후에 처리 될 것이기 때문입니다. 나는 조금 대답을 업데이트했다. –