【问题标题】:@PostMapping not working. HTTP 415 Unsupported MediaType Error@PostMapping 不起作用。 HTTP 415 不支持的媒体类型错误
【发布时间】:2018-11-17 05:52:15
【问题描述】:

我创建了一个@RestController 并映射了一个@PostMapping 请求。

我将 Content Type 作为“application/json”传递给控制器​​,在该控制器中,我正在读取带有 @RequestBody 注释的 JSON,并将其映射到我的 Model 类对象。

@RestController:

@PostMapping("/saveUser")
public UserDetails save(@RequestBody UserDetails user) {
    System.out.println("from json input : "+user.idVal+" : "+user.getName());
    service.save(user);
    JSONObject jsn = new JSONObject();
    jsn.put("Result", user.getName());
    return user;
}

HTTP 请求

{
"idVal":"asdadasd",
"name":"TestUser"
}

模型类

import javax.persistence.Entity;
javax.persistence.Id;

@Entity
public class UserDetails {

    @Id
    public String idVal;
    public String name;

    public String getId() {
        return idVal;
    }
    public void setId(String id) {
        this.idVal = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

我使用 Postman 作为 REST 客户端。

以下是我得到的错误:

HTTP Status 415 – Unsupported Media Type
Type Status Report

Description The origin server is refusing to service the request because the payload is in a format not supported by this method on the target resource.

Apache Tomcat/8.5.31

我试过如下:

@PostMapping(value="/saveUser", consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)
public UserDetails save(@RequestBody UserDetails user) {
    System.out.println("from json input : "+user.idVal+" : "+user.getName());
    service.save(user);
    JSONObject jsn = new JSONObject();
    jsn.put("Result", user.getName());
    return user;
}

编辑:

以下是完整的邮递员请求:

 POST /Zcrud/saveUser HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: fa4cfc76-d60c-f8dd-53b9-fd8b0b27ef7d

{
    "idVal":"asdadasd",
    "name":"TestUser"
}

回复:

<!doctype html><html lang="en"><head><title>HTTP Status 415 – Unsupported Media Type</title><style type="text/css">h1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} h2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} h3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} body {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} b {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} p {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;} a {color:black;} a.name {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 415 – Unsupported Media Type</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server is refusing to service the request because the payload is in a format not supported by this method on the target resource.</p><hr class="line" /><h3>Apache Tomcat/8.5.31</h3></body></html>

【问题讨论】:

  • 你的 pom &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.codehaus.jackson&lt;/groupId&gt; &lt;artifactId&gt;jackson-mapper-asl&lt;/artifactId&gt; &lt;version&gt;1.8.5&lt;/version&gt; &lt;/dependency&gt; &lt;/dependencies&gt;Reference中定义了这个依赖
  • 1) 为什么要在控制器中创建无用的JSONObject? 2) 请发布完整的 HTTP 请求日志。

标签: java spring-mvc


【解决方案1】:

您在 Postman 的请求中将 application/json 传递给 Your Application。但是您的服务器不明白application/json 是什么。

因此,您也必须在服务器中定义要处理的请求类型以及要产生的响应类型。

为此,请更改您的@RestController@PostMapping,如下所示

@PostMapping(value ="/saveUser", consumes = MediaType.APPLICATION_JSON_VALUE,
        produces = MediaType.APPLICATION_JSON_VALUE)
public UserDetails save(@RequestBody UserDetails user) {
   System.out.println("from json input : "+user.idVal+" : "+user.getName());
   service.save(user);
   JSONObject jsn = new JSONObject();
   jsn.put("Result", user.getName());
   return user;
}

希望对你有帮助!! :)

【讨论】:

  • 哪个 jar 用于“MediaType”?
  • MediaType 来自这个org.springframework.http 包,className 的完整路径是org.springframework.http.MediaType; 所以它带有springframework
  • 另外,为了您的兴趣,MediaType.APPLICATION_JSON_VALUE 只是一个最终的静态字符串,其值为"application/json",因此您可以在consumesproduces 参数中对其进行硬编码。无论如何,那个解决方案有用吗??
  • Thnx 但它仍然没有工作!我已经更新了帖子
  • 在这种情况下,我会要求您提供邮递员提出的确切要求!
【解决方案2】:

将 Content-Type: application/json;odata=verbose 添加到您的 @PostMapping 注释

【讨论】:

    猜你喜欢
    • 2017-07-05
    • 2015-08-29
    • 2018-10-13
    • 2018-07-25
    • 2016-09-09
    • 2013-01-16
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多