首页 > 解决方案 > 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 在同一个应用程序中的行为如此吗?还是我忘记或错过了什么,以避免杰克逊转换我的请求/响应?

我希望我能详细说明我的问题。

标签: jsonspringspring-mvcjacksongson

解决方案


经过一番研究,我发现 Spring 4Jackson在添加到类路径时会自动使用。在我的 *.xml 配置文件中,我有<mvc:annotation-driven/>. 它导致了RequestMappingHandlerAdapter带有默认Jackson转换器的第二个实例,而没有GsonHttpMessageConverter. 这就是为什么我的所有 RestEndpoints 都不能正常工作的原因,但 Swagger 可以。

我将我的项目迁移到使用 Jackson 而不是 Gson 并解决了我的问题。


推荐阅读