【问题标题】:Unsupported Media type 415 @RequestBody Not working But @RequestParam is working不支持的媒体类型 415 @RequestBody 不工作但 @RequestParam 工作
【发布时间】:2019-12-02 14:27:58
【问题描述】:

我有一个模型类和一个控制器。我在邮递员的正文中发布 json 类型的数据。但每次我收到不受支持的媒体类型 415 错误。 这是我的模型类:

public class Model1 {
    private String name;
    private String password;
    public Model1() {
        System.out.println("In the Model");
    }
    public String getName() {
        return name;
    } 

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Model1 [name=" + name + ", password=" + password + "]";
    }
}

我的控制器是:

@Controller
@ResponseBody
public class EcomController { 
    @RequestMapping(value="/getLogin", method=RequestMethod.POST, 
    consumes=MediaType.APPLICATION_JSON_VALUE)
    public String getLoginStatus(@RequestBody Model1 name){
        return "successfully called Post"+name.toString();
    }
}

我使用 HttpServletRequest 代替 @RequestBody 并且它有效。但是为什么当我使用@RequestBody 时它没有醒来?

这是邮递员的快照。 Here is the image of request from postman

{
    "name": "anshsh",
    "password": "vbvfjh"
}

This is the Screen shot of headers used in the request

【问题讨论】:

  • 你是否在请求中传递了带有值MediaType.APPLICATION_JSON_VALUEContent-Type 标头?
  • 你如何调用端点?
  • 我从 PostMan 调用这个 post API。我使用了带有 JSON 值的 content-Type 标头。这是 Json : { "name": "anshsh", "password": "vbvfjh" }
  • 我亲自运行你的实现,它运行良好。请求正文是否具有适当的 JSON 格式?
  • 只是为了确定 - content-type 标头值为“application/json”?

标签: spring-mvc


【解决方案1】:

我在我的配置文件中发现了错误。 添加<mvc:annotation-driven /> 解决了这个问题。

说明:
我的程序运行良好,但问题在于将字符串(Json)映射到 java 对象中。所以默认映射类中存在一些问题。虽然杰克逊出现在类路径中,但它不起作用。
<mvc:annotation-driven />
此标记将注册向您的@Controllers 发送请求所需的 HandlerMapping 和 HandlerAdapter。此外,它还根据类路径中存在的内容应用一些默认值。如:如果 Jackson 在 classpath 上,则支持读写 JSON。

【讨论】:

    【解决方案2】:

    有两个方面可以检查此类问题。

    1. 在请求中添加Content-typeapplication/json(您 已经完成了)
    2. 确保您拥有jackson(核心和数据绑定) 类路径中的库

    第 2 点是确保应用程序能够在 JSON 和 Java 类型之间进行转换。

    要进一步缩小问题范围,请检查日志并尝试 GET API 并查看 Java 对象是否已转换为 JSON 字符串。

    完整的工作代码请参考this link

    【讨论】:

    • GET API 运行良好:@RequestMapping(value="/getUser", method=RequestMethod.GET) public String getUser(){ return "some String value"; }
    • 感谢您的支持。该链接很有用。
    【解决方案3】:

    你不需要把@ResponseBody放在那里

    还有一些例子是

    @RestController 
    public class EcomController { 
        @PostMapping("/getLogin")
        public String getLoginStatus(@RequestBody Model1 name){
            return "successfully called Post"+name.toString();
        } 
    }
    

    如果你一直出错,我认为问题是 servlet 没有找到你的控制器注册..你能在你尝试编译时提供更多详细信息,比如日志吗?

    【讨论】:

      猜你喜欢
      • 2020-09-19
      • 2014-05-10
      • 2019-05-01
      • 2019-03-23
      • 2017-06-30
      • 2017-07-05
      • 2016-11-26
      相关资源
      最近更新 更多