【问题标题】:How to avoid spring application failure due to BeanCreationException caused by third party package如何避免第三方包导致的BeanCreationException导致spring应用失败
【发布时间】:2020-12-28 00:05:50
【问题描述】:

我在我的 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 

【问题讨论】:

  • 我们有一个 docker-compose 文件来启动我们所依赖的服务,因为我们在很多地方都有这个问题:甚至我们的数据库迁移也需要一个 bean 来与代理对话以“锁定”迁移以防多个节点尝试运行数据库迁移。
  • 你有 3k 的声望,你知道练习:请帮助其他人通过提供至少异常调用堆栈、方面(尤其是使用的切入点)之类的信息来帮助你。两者都在这里相关,因为您已标记问题 spring-aop.

标签: spring-boot spring-aop nats.io beancreationexception


【解决方案1】:

natsConnection bean 是通过自动配置创建的,并带有 @ConditionalOnMissingBean 注释。这样的 bean 是在 你自己的 bean 之后实例化的。

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

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

【讨论】:

  • Hmm.. 但是在我的自定义 bean 之后不会调用库来创建自动配置 bean?我想知道这是否会导致某种重复?
  • @nitinsh99:我已经更新了答案。因为 @ConditionalOnMissingBean 只有你的 bean 会被装箱,而默认的不会。
猜你喜欢
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 2012-03-07
  • 2019-12-26
  • 2014-07-21
  • 2021-08-15
  • 2016-07-21
相关资源
最近更新 更多