значение получить нулевое значение с помощью метода post в контроллере java spring - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь сделать вызов API с помощью метода post через почтальона в моем приложении весенней загрузки. Вот входные данные:

{
  "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

Вот моя роль.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;

Что здесь пошло не так? Любая помощь будет очень полезна. Спасибо!

UPDATE

Благодаря Burm87 я выбрал вариант 1 из его предложений в ответе. Но, каким-то образом весна все еще видит role_id как ноль, даже значение теперь печатается. Вот в 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, поскольку я определяю user.getRole() в DTO как int, но определяю newUser.setRole() в User сущности как Role. Но если я заменим сущность setRole в User на int, то как я могу рассказать весне об отношении ManyToOne между User и Role? Примечание: я думаю, что просто хочу сделать входной параметр для 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;
}

Ответы [ 3 ]

3 голосов
/ 17 апреля 2019

У вас есть два варианта:

1) вы сохраняете запрос и изменяете это поле roleDto в своем DTO на целочисленное поле с именем role (соответственно переименовывая геттер и сеттер);

2) вы сохраняете свой DTO таким, какой он есть, и изменяете отправку запроса:

{
  "username": "name",
  "password": "1234",
  "age": 12,
  "salary": 5000,
  "roleDto": {
      "id": 1,
      "roleName": "your role name"
  }
}
2 голосов
/ 17 апреля 2019

роль равна нулю, потому что в UserDTO у вас есть RoleDto.Поэтому вам нужно переименовать «role» в «roleDto», так как это сложный объект, у него будет свой собственный json.Пожалуйста, замените его следующим Json и убедитесь, что он работает.Пожалуйста, следуйте этому учебнику для большего понимания.

{
  "username": "name",
  "password": "1234",
  "age": 12,
  "salary": 5000,
  "roleDto": {
"id":1
}
}
1 голос
/ 17 апреля 2019

Это потому, что в вашем json есть "role": 1, а в dto - user.getRoleDto().Существует несоответствие между именами, поэтому оно не может быть правильно сопоставлено.Попробуйте изменить имя поля с roleDto в UserDto на role.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...