json - Gson 和 Jackson 在 Spring MVC 中导致“找不到 /restendpoint 的处理程序方法”
问题描述
我正在尝试在 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 /...
。我猜杰克逊和 Gson 以这种方式不兼容。当我删除 jackson.core 依赖项时,一切正常。
在项目中使用 Gson 是绝对必要的,我们也在 spring 的应用程序上下文中设置了它。
<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 4Jackson
在添加到类路径时会自动使用。在我的 *.xml 配置文件中,我有<mvc:annotation-driven/>
. 它导致了RequestMappingHandlerAdapter
带有默认Jackson
转换器的第二个实例,而没有GsonHttpMessageConverter
. 这就是为什么我的所有 RestEndpoints 都不能正常工作的原因,但 Swagger 可以。
我将我的项目迁移到使用 Jackson 而不是 Gson 并解决了我的问题。
推荐阅读
- pdf - 在乳胶#2中插入pdf文件
- python - Django - 如何在模板中显示父模型属性
- sql - SQL 将所有数据插入桥接表,(多对多)
- sql - SQL 使用另一个表中的值更新表
- azure-devops - Devops:错误 CS0103:当前上下文中不存在名称“Windows”
- c - 为什么线程在共享局部变量时有自己的堆栈?
- java - 线程卡在应用程序中
- python-3.x - 在 Pi3 和 Python 3.6 中使用两个 MPR121 HAT 时出现问题
- javascript - Javascript链接选项到else if
- ruby - 一次获取中的 Ruby 超时