Я пытаюсь сделать вызов 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;
}