值在java spring控制器中使用post方法接收null

时间:2019-04-17 15:13:14

标签: java spring rest spring-boot

我尝试通过邮递员使用post方法对我的spring boot应用程序进行API调用。 输入如下:

{
  "username": "name",
  "password": "1234",
  "age": 12,
  "salary": 5000,
  "role": 1
}

这是控制器中的代码:

@RequestMapping(value = "/signup", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> saveUser(@RequestBody UserDto user) {
        try {
            System.out.println(user.getUsername()); // => name
            System.out.println(user.getPassword()); // => 1234
            System.out.println(user.getSalary()); // => 5000
            System.out.println(user.getRoleDto()); // => null
            System.out.println(user.getAge()); // => 24
            userService.save(user);
            return ResponseEntity.ok().body("insert done");
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }

user.getRoleDto()之外,所有属性均打印其值,该值始终为null。但是,当我尝试在控制器中使用此代码(在代码下方)时,它会像输入对象一样打印整个对象。

@RequestMapping(value="/signup", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> saveUser(HttpEntity<String> httpEntity){
    try {
        String json = httpEntity.getBody();
        System.out.println(json);
        return ResponseEntity.ok().body("insert done");
    } catch (Exception e) {
        return ResponseEntity.badRequest().body(e.getMessage());
    }
}

这是我的User.java

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String username;
@Column
@JsonIgnore
private String password;
@Column
private long salary;
@Column
private int age;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "role_id")
private Role role;
// getters and setters

这是我的Role.java

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "role_name", nullable = false)
private String roleName;
// getters and setters

这是我的UserDto.java

private String username;
private String password;
private int age;
private long salary;
private RoleDto roleDto;

这是我的RoleDto.java

private Long id;
private String roleName;

这里出了什么问题?任何帮助都将非常有帮助。谢谢!

更新

感谢Burm87,我从答案中的建议中选择了选项1。但是,以某种方式,spring仍将role_id视为null,即使现在已打印该值。这是在userServiceImpl中:

    @Override
    public User save(UserDto user) throws Exception {
        User newUser = new User();
        BeanUtils.copyProperties(user, newUser, "password");
        // above line is refer to [here][1].
        newUser.setPassword(bcryptEncoder.encode(user.getPassword()));
        try {
            userDao.save(newUser);
        } catch (Exception e) {
            throw new Exception(e);
            // this throw "Column role_id cannot be null"
        }
        return newUser;
    }

但是,如果我使用下面的代码,则setRole方法是not applicable,因为我在DTO中将user.getRole()定义为int,但在DTO中定义了newUser.setRole() User个实体为Role。但是,如果我将setRole实体中的User更改为int,那么我该如何告诉弹簧ManyToOne和{{1 }}?注意:我想我只想像上面提供的那样将User的输入参数设为Role

role

3 个答案:

答案 0 :(得分:3)

您在这里有两个选择:

1)保留请求,然后在DTO中将此字段roleDto更改为名为role的Integer字段(相应地重命名getter和setter);

2)您保留DTO不变,然后更改发送请求:

{
  "username": "name",
  "password": "1234",
  "age": 12,
  "salary": 5000,
  "roleDto": {
      "id": 1,
      "roleName": "your role name"
  }
}

答案 1 :(得分:2)

role为空,因为在UserDTO中您具有RoleDto。因此,您需要将“ role”重命名为“ roleDto”,因为它是一个复杂的对象,它将具有自己的json。请用以下Json替换它,然后查看它是否有效。请按照此tutorial进行详细了解。

{
  "username": "name",
  "password": "1234",
  "age": 12,
  "salary": 5000,
  "roleDto": {
"id":1
}
}

答案 2 :(得分:1)

这是因为在json中有"role": 1,在dto中有user.getRoleDto()。名称之间不匹配,因此无法正确映射。尝试将字段名称从roleDto中的UserDto更改为role