【发布时间】:2015-09-27 06:16:51
【问题描述】:
直到最近,我的 swagger 文档大部分都是免费的,因为我使用 Camel 来公开我的 REST API。我不得不放弃 Camel,因为它与 Jackson 相处得很好,所以我正在尝试设置 SpringFox。不幸的是,简单地将 SpringFox 添加为依赖项会以某种方式破坏我的 Spring 上下文,并抛出一个模糊且不正确的错误,声称我没有明确的 ObjectMapper bean,我这样做了 - 无法让 Camel 使用所述 bean 是我必须删除的原因它。
明确一点,不做任何代码改动,只添加如下依赖:
compile group: "io.springfox", name: "springfox-swagger2" version: "2.0.2"
导致问题。我正在使用 Jackson 2.5.3 和 Spring Boot 1.2.3.RELEASE
FWIW 这是堆栈跟踪中有趣的部分:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration$HypermediaConfiguration$HalObjectMapperConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.fasterxml.jackson.databind.ObjectMapper org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration$HypermediaConfiguration$HalObjectMapperConfiguration.primaryObjectMapper; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.fasterxml.jackson.databind.ObjectMapper] is defined: expected single matching bean but found 2: objectMapper,_halObjectMapper
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.test.SpringApplicationContextLoader.loadContext(SpringApplicationContextLoader.java:101)
at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:68)
at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:86)
... 45 more
【问题讨论】:
-
错误很直接,有两个类或两个 bean 或同一组件的两个实现。
expected single matching bean but found 2: objectMapper,_halObjectMapper。也许您与正在使用的库发生冲突。 -
我如何找出哪个@Configuration 类正在公开它,以便将其从@EnableAutoConfiguration 中排除?
-
我会找出哪些 jars 有这个类:
com.fasterxml.jackson.databind.ObjectMapper然后我会看看哪些对它有依赖关系,然后从其中一个中排除它。您可以从 springfox 依赖项中排除 Jackson 依赖项进行测试 -
在它之前可能有更多的堆栈跟踪,在它之后不太可能......你介意发布所有的堆栈跟踪吗?这样你就可以遍历依赖链,看看是哪个 bean 导致了问题。尝试找出问题并可能解决这个问题会很棒。我建议您在 springfox.io 中创建一个问题,最好使用一个演示该问题的存储库。
-
我怀疑你的代码中有
@EnableHypermediaSupport。尝试删除它