【问题标题】:value receive null with post method in the java spring controller值在java spring控制器中使用post方法接收null
【发布时间】:2019-09-07 21:32:57
【问题描述】:

我尝试通过邮递员使用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,但在 User 实体中将 newUser.setRole() 定义为 Role。但是,如果我将User 实体中的setRole 更改为int,那么,我该如何告诉spring UserRole 之间的ManyToOne 关系?注意:我想我只想将role 的输入参数设置为上面提供的integer

@Override
public User save(UserDto user) throws Exception {
    User newUser = new User();
    newUser.setUsername(user.getUsername());
    newUser.setPassword(bcryptEncoder.encode(user.getPassword()));
    newUser.setAge(user.getAge());
    newUser.setSalary(user.getSalary());
    newUser.setRole(user.getRole()); // here is the problem
    try {
        userDao.save(newUser);
    } catch (Exception e) {
        throw new Exception(e);
    }
    return newUser;
}

【问题讨论】:

    标签: java json spring rest spring-boot


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这里有两种选择:

      1) 您保留您的请求,并将 DTO 中的此字段 roleDto 更改为名为 role 的整数字段(相应地重命名 getter 和 setter);

      2) 你保持你的 DTO 不变并且你改变你的请求发送:

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

      【讨论】:

        【解决方案3】:

        role 为空,因为在 UserDTO 中你有 RoleDto。所以你需要将“role”重命名为“roleDto”,因为它是一个复杂的对象,它会有自己的json。请用以下 Json 替换它,看看它是否有效。请关注此tutorial 以获得更多了解。

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

        【讨论】:

          猜你喜欢
          • 2018-03-24
          • 2016-05-01
          • 2017-08-15
          • 2016-12-08
          • 1970-01-01
          • 2016-02-28
          • 1970-01-01
          • 2021-04-21
          • 1970-01-01
          相关资源
          最近更新 更多