发布帖子时出现错误400 Spring Json @RequestBody

use*_*206 3 java spring json web

这是涉及的课程。

public class UserAuthDto {

    private String username;

    private String password;

    private List<String> roles;

    private String tenantCode;

    public UserAuthDto(String username,
                           String password,
                           List<String> roles,
                           String tenantCode){
        this.username=username;
        this.password=password;
        this.roles=roles;
        this.tenantCode=tenantCode;
    }

    public void setUsername(String username) {
        this.username = username;
    }

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

    public void setRoles(List<String> roles) {
        this.roles = roles;
    }

    public void setTenantCode(String tenantCode) {
        this.tenantCode = tenantCode;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public List<String> getRoles() {
        return roles;
    }

    public String getTenantCode() {
        return tenantCode;
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个DTO

public class UserAuthRequest {

    private UserAuthDto userAuthDto;

    public UserAuthRequest(UserAuthDto authDto){
        if(authDto == null){
            throw new IllegalArgumentException("User Authentication DTO Should Not be null");
        }
        this.userAuthDto = authDto;
    }
    public String getUsername(){
        return userAuthDto.getUsername();
    }

    public String getPassword(){
        return userAuthDto.getPassword();
    }

    public List<String> getRoles(){
        return  userAuthDto.getRoles();
    }

    public String getTenantCode(){
        return  userAuthDto.getTenantCode();
    }

    public void setUsername(String username) {
        this.userAuthDto.setUsername(username);
    }

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

    public void setRoles(List<String> roles) {
        this.userAuthDto.setRoles(roles);
    }

    public void setTenantCode(String tenantCode) {
        this.userAuthDto.setTenantCode(tenantCode);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是正在处理请求的控制器。

@RequestMapping(value = "authenticate", method = RequestMethod.POST,consumes = "application/json",produces = "application/json")
    public UserAuthResponse authenticate(@RequestBody UserAuthRequest authRequest){
       //.
    }
Run Code Online (Sandbox Code Playgroud)

但是当我发送数据时

{"username": "test","password":"test","roles":null,"tenantCode":"test"}
Run Code Online (Sandbox Code Playgroud)

我收到一个400错误的请求。知道为什么吗?

Sot*_*lis 5

Spring使用Jackson将请求中的JSON映射到Java对象,以作为参数传递给您的处理程序方法。

这是JSON类型。这是Jackson进行JSON映射的方式:

  1. JSON对象映射到Java Map或自定义类对象
    • JSON对象键值对的键映射到类实例字段
  2. JSON阵列映射到Java阵列或Collection类型(ListSet等)
  3. JSON号码映射到Java数值类型(intdoubleLong等获得原始和引用类型)
  4. JSON字符串映射到Java String对象(如果JSON字符串是键,则映射到字段)
  5. JSON空值映射到Java null
  6. JSON的false和true映射到Java falsetrue

您提供了以下JSON

{"username": "test","password":"test","roles":null,"tenantCode":"test"}
Run Code Online (Sandbox Code Playgroud)

这是一个JSON对象,具有4键-值对,其中键是usernamepasswordroles,和tenantCode。因此,您需要一个Java类,其中包含带有这些名称的字段(或属性)。您有这样的课程UserAuthDto。那就是您应该使用的参数类型。


您可以通过在类路径上提供适当的slf4j和logback或log4j库并为Spring的记录器提供适当的配置来启用日志记录。