【问题标题】:SpringFox dependency breaking my Spring ContextSpringFox 依赖打破了我的 Spring 上下文
【发布时间】: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。尝试删除它

标签: java spring swagger


【解决方案1】:

我也有同样的问题。我终于能够将其范围缩小到根本原因,就我而言,这就是@Dilip 上面指出的。

不知何故,当我包含 springfox 依赖项时,我的项目中启用了 HypermediaSupport,即使我的项目中没有明确的 @EnableHypermediaSupport 注释。我认为 Spring 会自动启用它,因为我的主要 java 配置类中有 @EnableAutoConfiguration

我能够通过我的 java 配置类中的 @EnableAutoConfiguration(exclude = {HypermediaAutoConfiguration.class}) 注释排除“HypermediaAutoConfiguration”来克服这个问题。

完成此步骤后,异常消失了。希望这可以帮助。

【讨论】:

  • 这仍然在我的“修复”列表中,但我认为你的解决方案是正确的,所以我会接受它。如果/当我有机会验证时会更新。
  • 更新:这确实工作得很好。干杯@stirfries
  • 我也有同样的问题,我们能否追踪真正启用 HypermediaAutoConfiguration 的原因?
【解决方案2】:

你需要像下面的例子一样添加你的转换:

@Configuration
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

        @Override
        protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
                converters.add(converter());
                addDefaultHttpMessageConverters(converters);
        }

        @Bean
        MappingJackson2HttpMessageConverter converter() {
                return new MappingJackson2HttpMessageConverter(new JacksonObjectMapper().getObjectMapper());
        }

}

*JacksonObjectMapper 是我的映射器类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多