私は、(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の共通フレームは、私はそれがサードパーティのライブラリによって開始されたデーモンスレッドによって引き起こされたことがわかっ
「このBeanを注入できなかったのに、まだアプリが実行されています」とはどういう意味ですか? このBeanを注入する場所は(required = false)ですか? – pvpkiran
@pvpkiran 'required = false'に関するヒントを教えてください。私はコードスニペットを追加して、どのようにそのBeanを注入するのかを示しました。 – Kane
いくつかの質問があります。 1.アプリケーションがまだ動作していると言うと、残りのエンドポイントに到達することはできますか?(私はそうは思わない) 2.他のいくつかのクラスでこのBean NoSpellChecker(@Autowire)を使用していますか? – pvpkiran