尝试发布请求时,Spring Boot“HttpMessageNotReadableException缺少必需的请求正文”

时间:2017-05-05 13:03:46

标签: java spring spring-boot

我有一个控制器类,其中包含一些方法,其中一个方法应该接受POST请求并使用该POST请求正文中的JSON创建一个新帐户。

当我尝试使用curl发出POST请求时,我收到错误

{"timestamp":1493988808871,"status":400,"error":"Bad Request","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"Required request body is missing: org.springframework.http.ResponseEntity<?> com.example.AccountRestController.add(java.lang.String,java.lang.String)","path":"/users/add"}

我正在使用的curl命令

curl -X POST --data '{"userName":"bepis", "password":"xyz"}' -H "Content-Type:application/json" http://localhost:8080/users/add

AccountRestController

@RequestMapping(method = RequestMethod.POST, value = "/add", produces = { MediaType.APPLICATION_JSON_VALUE})
ResponseEntity<?> add(@RequestBody String username, @RequestBody String password) {
    Account result = accountRepository.save(new Account (username, password));
    return new ResponseEntity<>(result, HttpStatus.CREATED);
}

2 个答案:

答案 0 :(得分:5)

您不能使用多个@RequestBody。您需要将所有内容包装到一个用于匹配您的请求主体的类中。

here也回答了同样的问题。

功能请求还有一个JIRA issue被拒绝。

注意:如果您想少写,可以使用@PostMapping代替@RequestMapping(method = RequestMethod.POST)

注意: @RequestParam@PathVariable用于从URI中提取数据,而不是从正文中提取数据。

注意:同样适用于[FromBody]的等效ASP.NET WebAPI属性。

完整示例:

Bellow我创建了一个类似于你的案例的工作示例:

申请DTO

public class AccountCreateRequest {

    private String userName;
    private String password;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

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

响应DTO

public class AccountCreateResponse {

    private String userName;
    private String password;

    public AccountCreateResponse() {
    }

    public AccountCreateResponse(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

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

<强>控制器

@RestController
@RequestMapping("/v1/account")
public class AccountController {

    @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseStatus(HttpStatus.CREATED) AccountCreateResponse add(@RequestBody() AccountCreateRequest account) {
        AccountCreateResponse response = new AccountCreateResponse(account.getUserName(), account.getPassword());
        return response;
    }
}

卷曲请求

curl -X POST --data '{"userName":"bepis", "password":"xyz"}' -H "Content-Type:application/json" http://localhost:8080/v1/account

答案 1 :(得分:0)

所以我将 @Requestbody 更改为单个 @RequestBody ,就像andreim所说,它修复了我的错误请求错误但由于某种原因,帐户用户名始终是 null 。

我搞砸了一些事情,最终导致我从

交换了帐户构造函数参数的顺序
Account(String username, String password)

Account(String password, String username)

这是因为某种原因,让我用适当的值来发布我的帖子请求。出于好奇,我决定将参数交换回Account(String username, String password) 并且邮寄请求仍然按预期工作。

我不知道我做了什么来摆脱 null 问题,但它接缝已经奏效了。