SpringFox 依赖破坏了我的 Spring 上下文

SpringFox dependency breaking my Spring Context

直到最近,我的 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.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

您需要像下面的示例一样添加转化者:

@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 是我的映射器 class。

我遇到了完全相同的问题。我终于能够将其缩小到根本原因,就我而言,这就是@Dilip 上面指出的原因。

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

我可以通过 java 配置 class.

中的 @EnableAutoConfiguration(exclude = {HypermediaAutoConfiguration.class}) 注释排除 'HypermediaAutoConfiguration' 来解决这个问题

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