我正在尝试在Spring MVC应用程序中添加Swagger-UI。org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
的所有请求和响应都由gson 2.6.1
序列化(请参阅以下代码)。
当我尝试集成 Swagger 时,我必须添加以下依赖项:
<!-- json request -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
Swagger的集成运行良好,但我的一些要求被打破了。我收到AbstractHandlerMethodMapping: 302 - Did not find handler method for /...
.我猜杰克逊和格森以这种方式不兼容。当我删除 jackson.core 依赖项时,一切正常。
项目中,绝对需要使用 Gson,我们也在 spring 的应用程序上下文中设置了 Gson。
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
</list>
</property>
</bean>
<bean id="gsonBuilder" class="com.google.gson.GsonBuilder" init-method="serializeNulls" />
<bean id="jsonConverter" class="org.springframework.http.converter.json.GsonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
<property name="gson">
<bean class="com.google.gson.Gson" factory-bean="gsonBuilder"
factory-method="create" />
</property>
</bean>
我的问题是,有人知道为什么杰克逊和gson在同一个应用程序中表现得像这样吗?还是我忘记或错过了什么,以避免杰克逊转换我的请求/响应?
我希望我能详细澄清我的问题。
经过一些研究,我发现 Spring 4 在添加到类路径时会自动使用 Jackson
。在我的 *.xml 配置文件中,我有<mvc:annotation-driven/>
.它导致使用默认Jackson
转换器的第二个RequestMappingHandlerAdapter
实例,而没有GsonHttpMessageConverter
。这就是为什么我所有的 RestEndpoint 都无法正常工作的原因,但 Swagger 做到了。
我将我的项目迁移到使用 Jackson 而不是 Gson,我解决了我的问题。