Spring @RequestBody Bad Request

时间:2016-09-28 11:27:44

标签: java json spring

我正在使用POSTMAN发送请求。

在那里配置好:

  • Content-Type application / json
  • 请求类型POST 在Body中我有以下内容:
{
    "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();
    }

}

5 个答案:

答案 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。如果您不能更好地对类进行分类,请将类放到UtilsMisc package,但不要在Controller s中声明类!

答案 4 :(得分:0)

尝试为该类添加一个空构造函数。