2017-04-27 6 views
0

私は、(SpringBoot1.5.3に基づいて)私のアプリケーションにBeanを持っていますが、これは多くのリソースを読み込むために時間がかかります。そのBeanの初期化中にWebアプリケーションが既にポートでリッスンを開始している間に、そのBeanの初期化が失敗しても例外がスローされたとしても、Springブートアプリケーションはまだ実行されています。Beanの注入に失敗した場合、SpringブートWebアプリケーションの終了を非ゼロにする方法

しかし、Beanの注入に失敗したにもかかわらず、まだアプリが実行されています。

Beanを注入できなかった場合は、エラーコードでSpring Webアプリケーションを終了する方法です。以下は

NoteSpellCheckerに応じて、別のBeanがあり

@Component 
@Slf4j 
@RefreshScope 
@Profile("!integTest") 
public class NoteSpellChecker { 

private Directory spellIndexDirectory; 
private SpellChecker spellChecker; 

public NoteSpellChecker(@Value("${app.spellcheck.indexPath:build/suggest}") String spellIndexPath, 
         @Value("${app.spellcheck.accuracy:0.5f}") float spellAccuracy, 
         @Value("${app.spellcheck.suggestDirectory:${spring.cloud.config.uri}/${spring.application.name}" + 
           "/${spring.profiles.active}/${spring.cloud.config.label:master}/spellcheck/note.txt},") 
           String[] spellSuggestDirectories, 
         OkHttpClient httpClient) throws IOException { 
**here run some initialization task that takes some time** 
} 

、私の豆をinjectectingどのような方法です。以下のコードを参照してください、

@Configuration 
@Slf4j 
public class NoteDBConfig { 

@Bean 
public List<NoteRecognizer> noteRecognizers(NoteSpellChecker noteSpellChecker, 
              NoteDBRepository noteDBRepository) { 
    return noteDBRepository.findByEnabled(true).sorted((n1, n2) -> n1.getOrder() - n2.getOrder()) 
      .map(note -> new NoteRecognizerImpl(note, noteSpellChecker)) 
      .collect(Collectors.toList()); 
} 
} 

春ブートアプリケーションは、Beanの初期設定の誤りが原因を開始することができなかったが、JVMはまだ終了せずに実行されています。だからデーモンアプリ(春の起動アプリケーションを起動する)は私のアプリの致命的な例外を認識していません。以下

2017年4月28日17、コンソールに出ている:36:54.483 ERROR [magiceyeサーバ,,,] 32444 --- [メイン
] osboot.SpringApplication。アプリケーションの起動に失敗しました

org.springframework.beans.factory.BeanCreationException:エラー 名前を持つBeanを作成する 'scopedTarget.noteSpellChecker' ファイルで定義されて [/.../service/impl/NoteSpellChecker.class]: Beanインスタンス化v iaコンストラクタが失敗しました。入れ子になった例外は org.springframework.beans.BeanInstantiationException: に失敗しました[service.impl.NoteSpellChecker]をインスタンス化しています: コンストラクターが例外をスローしました。ネストされた例外は org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactoryでorg.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:279) 時にjava.io.IOExceptionあります。 Javaの:1193) でorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)で at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean( org.springframework.cloud.context.scope.GenericScope $ BeanLifecycleWrapper.getBeanで org.springframework.beans.factory.support.AbstractBeanFactory $ 2.getObject(AbstractBeanFactory.java:345) でAbstractAutowireCapableBeanFactory.java:483) (GenericScope .java:359) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBeanでorg.springframework.cloud.context.scope.GenericScope.get(GenericScope.java:176) (AbstractBeanFactory.java:340で) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory。Javaの:197) でorg.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) org.springframework.cloud.context.scope.refresh.RefreshScope.start(RefreshScope.java:121)で でsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) でsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)は、Javaで 。 lang.reflect.Method.invoke(Method.java:498)at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:253) at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:174) でorg.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:137) org.springframework.context.eventで org.springframework.context.support.AbstractApplicationContext.publishEventで.SimpleApplicationEventMulticaster.invokeListener org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)で(SimpleApplicationEventMulticaster.java:167) (AbstractApplicationContext.java :383) at org.springframework.conte xt.support.AbstractApplicationContext.publishEvent org.springframework.boot.context.embedded.EmbeddedWebApplicationContextで org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:882)で(AbstractApplicationContext.java:337) 。 finishRefresh(EmbeddedWebApplicationContext.java:144) でorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545) org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.javaで: 122) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) でorg.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) でorg.springframework.boot.SpringApplication.run(SpringApplication.java:314) org.springframework.boot.SpringApplication.runでorg.springframework.beans.BeanInstantiationException: BackendApplication.main(BackendApplication.java:21) でorg.springframework.boot.SpringApplication.run(SpringApplication.java:1151)で(SpringApplication.java:1162) に起因: インスタンス化に失敗しました [service.impl.NoteSpellChecker]:コンストラクタが投げられました 例外。ネストされた例外は org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:122)で org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154)でjava.io.IOExceptionの ありますでorg.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:271) ... 32の共通フレームを除く原因:java.io.IOException:null at service.impl.NoteSpellChecker。(NoteSpellChecker .java:69) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(ネイティブ メソッド)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl。Javaの:java.lang.reflect.Constructor.newInstanceの62) でsun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) (Constructor.java:423) org.springframework.beans.BeanUtilsで。 instantiateClass(BeanUtils.java:142) は... 34の共通フレームは、私はそれがサードパーティのライブラリによって開始されたデーモンスレッドによって引き起こされたことがわかっ

+0

「このBeanを注入できなかったのに、まだアプリが実行されています」とはどういう意味ですか? このBeanを注入する場所は(required = false)ですか? – pvpkiran

+0

@pvpkiran 'required = false'に関するヒントを教えてください。私はコードスニペットを追加して、どのようにそのBeanを注入するのかを示しました。 – Kane

+0

いくつかの質問があります。 1.アプリケーションがまだ動作していると言うと、残りのエンドポイントに到達することはできますか?(私はそうは思わない) 2.他のいくつかのクラスでこのBean NoSpellChecker(@Autowire)を使用していますか? – pvpkiran

答えて

0

を省略しました。

関連する問題