![](/img/trans.png)
[英]Java/Spring > Handle Bad Request response for controller method with @RequestBody when no body is sent in request
[英]Spring @RequestBody Bad Request
我正在使用POSTMAN发送请求。
在那里配置好了:
{
"token":"EAACEdEose0cBAFLc4blCYmmetEMBEZCiQQZAuvz6DlxFt0yPZCksZBWv09B71aZCeDH9zOPyzM44GRl8WA56uFZBmOiUMmSlk3USfOwRdwmXDnhlPArttzjjLzUXaTReHzHZC7ZCcFzZADwGBLRUHvTb17nagRDLpZBysdxZBxuJuojlgZDZD"
}
我将此发布到控制器,并收到400错误请求错误:
{
"timestamp": 1475061564742,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "Could not read document: Can not construct instance of at.wastun.controller.WTUserController$RegisterBody: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)\n at [Source: java.io.PushbackInputStream@a646ac6; line: 2, column: 2]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of at.wastun.controller.WTUserController$RegisterBody: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)\n at [Source: java.io.PushbackInputStream@a646ac6; line: 2, column: 2]",
"path": "/users/register"
}
该类和Controller看起来像:
@Controller
@RequestMapping("/users")
@ResponseBody
public class WTUserController {
private class RegisterBody{
private String token;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public RegisterBody(String fbToken){
this.token = fbToken;
}
}
@RequestMapping(value="/register", method = RequestMethod.POST)
public String method0(@RequestBody RegisterBody body){
return body.getToken();
}
}
您的RegisterBody类是私有的。 因此,您的类代码之外的任何内容都不能创建它的新实例。 尝试:
public static class RegisterBody {
或者,最好将RegisterBody移到其自己的java文件中。
错误本身会告诉您问题的根源: no suitable constructor found
。 因此,您需要将默认构造函数添加到RegisterBody
类中。 另外,我不确定将此类设为private
好主意。
这是两个答案@Andremoniy和@Mr Spoon的组合
我上完课就上班了
public static class RegisterBody {
并删除了该构造函数并将其设置为默认构造函数。
public static class RegisterBody{
private String token;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
现在工作谢谢
当Spring尝试解析Body
它将使用默认的构造函数ClassName()
创建对象,然后尝试使用setter填充字段。 因此,如果要将RequestBody
解析为RegisterBody
则它应如下所示:
private class RegisterBody{
private String token;
public RegisterBody() {};
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public RegisterBody(String fbToken){
this.token = fbToken;
}
}
除此之外,Spring还出于某些原因实现了MVC。 如果您无法更好地对类进行分类,但不要在Controller
声明类,则将其放入Utils
或Misc
package
中!
尝试为该类添加一个空的构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.