繁体   English   中英

春季@RequestBody错误请求

[英]Spring @RequestBody Bad Request

我正在使用POSTMAN发送请求。

在那里配置好了:

  • 内容类型应用程序/ json
  • 请求类型POST,在“正文”中,我具有以下内容:
{
    "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声明类,则将其放入UtilsMisc package中!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM