2017-01-07 21 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クラス

@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

アプリケーション設定と自動検出クラス( @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を自動検出し、他のBeanが作成される前に適用します。 BeanRegistryPostProcessorBeanFactoryPostProcessorの実装なので、この手順で適用されます。

その後、BeanPostProcessorインタフェースを実装するすべてのBeanを自動的に検出し、その後作成されたBeanに適用します。この豆の1つはAutowiredAnnotationBeanPostProcessorで、@Autoware注釈を処理します。これはあなたのサービスがこのステップで注入されることを意味します。

に注入される前にDataConfigurationService beanを使用しようとしています。この問題を解決するため、あなたはBeanRegistryPostProcessorApplicationContextAwareインタフェースを実装し、アプリケーションコンテキストから直接サービスのインスタンスを取得することができます:あなたは春documentationで見つけることができる、いわゆるコンテナ拡張ポイントについて

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

詳細を。

+0

コンポーネントをConfguration for Serviceに置き換えても問題は解決しますか? –

+0

@SaurabhKumarいいえとにかく '@ Autowired'アノテーションは' BeanRegistryPostProcessor'が適用された後に処理されるためです。私は少し答えを更新しました。 –