第三方包BeanCreationException异常如何避免spring应用失败

How to avoid spring application failure due to BeanCreationException caused by third party package

我在 spring 启动应用程序中使用第三方包。这个 one to be specific. This package has a method 在应用程序启动时创建一个 bean。只有当这个包能够与 nats 服务对话时,bean 才会成功创建。在大多数情况下,这一切都很好。远程服务器可用,bean 已创建,我的 spring 启动应用程序正确启动。

但在某些边缘情况下,远程 nats 服务器可能未启动。这导致我的 spring 启动应用程序无法启动,因为上面的函数抛出 BeanCreationException

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

注意:如果此 bean(与 nats 服务的连接)不可用,我的 spring app/business 逻辑正常运行并且 运行 没问题。

特定异常:

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[=11=](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 注释。这样的 beans 在 你自己的 beans 之后被实例化。

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

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