如何避免第三方包导致的BeanCreationException导致spring应用失败

问题描述

我在 Spring Boot 应用程序中使用了第三方软件包。这 one 是具体的。这个包有一个 method,它在应用程序启动时创建一个 bean。仅当此包能够与 nats 服务通信时,才会成功创建 bean。在大多数情况下,这一切正常。远程服务器可用,bean 已创建,我的 Spring Boot 应用程序正确启动。

但是也有一些边缘情况,当远程 nats 服务器可能无法启动时。这导致我的 spring boot 应用程序无法启动,因为上述函数抛出 BeanCreationException

如何避免这种情况,即在 nats 服务器未启动时避免由于此异常导致的 spring 应用程序启动失败?

注意:如果这个 bean(连接到 nats 服务)不可用,我的 spring 应用程序/业务逻辑可以正常运行。

特定异常:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'natsConnection' defined in class path resource [io/nats/spring/boot/autoconfigure/NatsAutoConfiguration.class]:
Bean instantiation via factory method Failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [io.nats.client.Connection]:
Factory method 'natsConnection' threw exception; nested exception is java.io.IOException: Unable to connect to NATS server.\n\tat org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655)\n\tat org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:635)\n\tat org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.instantiateUsingFactoryMethod(AbstractAutowireCapablebeanfactory.java:1336)\n\tat org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBeanInstance(AbstractAutowireCapablebeanfactory.java:1176)\n\tat org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:556)\n\tat org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:516)\n\tat org.springframework.beans.factory.support.Abstractbeanfactory.lambda$doGetBean$0(Abstractbeanfactory.java:324)\n\tat org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)\n\tat org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:322)\n\tat org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:202)\n\tat org.springframework.beans.factory.support.DefaultListablebeanfactory.preInstantiateSingletons(DefaultListablebeanfactory.java:897)\n\tat org.springframework.context.support.AbstractApplicationContext.finishbeanfactoryInitialization(AbstractApplicationContext.java:879)\n\tat 

解决方法

bean natsConnection 由自动配置创建并使用 @ConditionalOnMissingBean 进行注释。此类 bean 在您自己的 bean 之后 实例化。

您可以创建自己的这种类型的 bean,io.nats.client.Connection,并将其注册为 natsConnection。这个 bean 应该没有自己的逻辑。第一次调用时,它应该通过 NatsAutoConfiguration.natsConnection(...) 创建一个工作实例,然后将所有调用委托给它。

由于 @ConditionalOnMissingBean,NATS 库中的默认 bean 将不会被实例化,只会创建您的 bean。