我正在使用POSTMAN发送请求。
在那里配置好:
{
"token":"EAACEdEose0cBAFLc4blCYmmetEMBEZCiQQZAuvz6DlxFt0yPZCksZBWv09B71aZCeDH9zOPyzM44GRl8WA56uFZBmOiUMmSlk3USfOwRdwmXDnhlPArttzjjLzUXaTReHzHZC7ZCcFzZADwGBLRUHvTb17nagRDLpZBysdxZBxuJuojlgZDZD"
}
我将其发布到控制器并获得400 BAD请求错误:
{
"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();
}
}
答案 0 :(得分:1)
您的RegisterBody类是私有的。因此,类中的代码之外的任何内容都不能创建它的新实例。尝试:
public static class RegisterBody {
或者,更好的是,将RegisterBody移动到自己的java文件中。
答案 1 :(得分:1)
错误本身会告诉您问题的根源:no suitable constructor found
。因此,您需要将默认构造函数添加到RegisterBody
类中。另外,我不确定这个课程private
是个好主意。
答案 2 :(得分:0)
这是@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;
}
}
立即致谢
答案 3 :(得分:0)
当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。如果您不能更好地对类进行分类,请将类放到Utils
或Misc
package
,但不要在Controller
s中声明类!
答案 4 :(得分:0)
尝试为该类添加一个空构造函数。