内容类型不受支持的问题

时间:2019-04-05 17:52:35

标签: java spring spring-mvc jackson

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

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

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

我在Jackson中也包含了pom.xml的依赖关系,以将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>

终于奏效了:)有人可以解释一下为什么吗?

1 个答案:

答案 0 :(得分:1)

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

在Spring配置(content-negotiation)中不做任何更改,用@PostMapping注释的方法使用并产生默认媒体类型(即application/json)的内容。仅当您要消费和产生其他媒体类型(即consumes)中的内容时,才有理由使用produces的{​​{1}}和@PostMapping属性。

因此,以下代码适合您:

application/xml

最后,您需要在请求中将@RestController public class FooRest { @PostMapping("/api/foo") public String foo(HttpServletRequest request, @RequestBody FooBean bean) { ... } } 标头作为accepts

您可以与我们分享您所请求的application/json版本吗?