【问题标题】:Content type not supported issue内容类型不受支持的问题
【发布时间】:2019-04-05 17:52:34
【问题描述】:

当我使用Postman 发送带有 JSON 正文 (application/json) 的 post 请求时,我在 spring-mvc 中收到此错误(我没有使用 spring boot

Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json' not supported

我尝试了有关此错误的所有 SO 主题,但没有任何效果:(

我还在pom.xml 中包含了Jackson 的依赖项,以将JSON 对象映射到POJO。

那么为什么它一直告诉我Content type 'application/json' not supported

我的控制器

@RestController
public class FooRest {
    // even with consumes=MediaType.APPLICATION_JSON_VALUE it does not work
    @RequestMapping(value = "/api/foo", method = RequestMethod.POST)
    public String foo(HttpServletRequest request, @RequestBody FooBean bean) {
        ...
    }
}

我的配置

@Configuration
@EnableWebMvc
@ComponentScan({"controllers"})
public class AppConfig implements WebMvcConfigurer { }

我的pom.xml

<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${springframework.version}</version>
    </dependency>


    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

    ...

</dependencies>

卷曲版

POST /MY-API HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 89859e26-813d-fb53-8726-57900f02207e

{ 
   //JSON OBJECT
}

解决方案

我变了

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

终于成功了 :) 有人能解释一下为什么吗?

【问题讨论】:

    标签: java spring spring-mvc jackson


    【解决方案1】:

    顺便说一下,@PostMapping@RequestMapping 注释的专用版本,它充当@RequestMapping(method = RequestMethod.POST) 的快捷方式。

    在不更改 Spring 配置 (content-negotiation) 的情况下,使用 @PostMapping 注释的方法使用和生成默认媒体类型的内容,即 application/json。仅当您想以不同的媒体类型(即application/xml)消费和制作内容时,才可以使用@PostMappingconsumesproduces 属性。

    所以,下面的代码对你来说应该没问题:

    @RestController
    public class FooRest {
    
        @PostMapping("/api/foo")
        public String foo(HttpServletRequest request, @RequestBody FooBean bean) {
            ...
        }
    }
    

    最后,您需要请求中的 accepts 标头为 application/json

    你能分享一下curl 版本的请求吗?

    【讨论】:

    • 感谢@AugustoJimenez 的解释,但它与我的代码相同,您刚刚将@RequestMapping 更改为@PostMapping
    • 您是否更改了默认的 Spring 配置?代码是一样的,但我告诉你映射的默认媒体类型是 application/json。所以,理论上代码是没问题的。
    • 不,我没有改变任何东西......我从 Postman 发布了 curl 版本......你认为我在 maven 中导入了不正确的 jackson 包吗??
    • 实际上,你不需要在你的 Spring 项目中添加 Jackson 依赖,因为 Spring 默认在内部使用 Jackson 来序列化和反序列化 json 格式的数据。
    • 我认为你错了,检查我的问题我解决了问题
    猜你喜欢
    • 2016-04-25
    • 2020-05-29
    • 2012-01-05
    • 2016-07-18
    • 2015-11-13
    • 2016-03-08
    • 2014-06-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多