Я пытаюсь сделать вызов API с помощью метода post через почтальона в мое приложение загрузки Spring.
Вот ввод:
{
"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.getRole()); // => 1
System.out.println(user.getAge()); // => 12
userService.save(user);
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 int role;
// getters and setters
Вот мой RoleDto.java
private Long id;
private String roleName;
// getters and setters
Проблема: выдает ошибку 'Column 'role_id' cannot be null'
Вот в userServiceImpl:
Строка ниже (BeanUtils) относится к здесь.
@Override
public User save(UserDto user) throws Exception {
User newUser = new User();
BeanUtils.copyProperties(user, newUser, "password");
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?
@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;
}
Примечание. Я думаю, что просто хочу, чтобы входной параметр для role был просто integer, как указано выше.




Поскольку вы получаете 1 для роли в своем запросе, вы должны сделать что-то вроде:
Role role = new Role();
role.setId(user.getRole());
role.setRoleName("some name");
newUser.setRole(role);
В первой части кода проблема может быть здесь BeanUtils.copyProperties(user, newUser, "password");, если вы попытаетесь отладить или напечатать newUser после этой строки, вы увидите, что BeanUtils не смог корректно заполнить все поля вашего newUser объекта. И это потому, что в пункте назначения (newUser) поле role имеет тип Role, а в источнике (пользователь) тип этого поля просто int.
@Akza, если вас не волнует имя роли, просто удалите его отовсюду, если оно вам небезразлично, вы должны откуда-то его взять. Вы пробовали мой фрагмент выше?
Что ж, это работает. Я думаю, что я просто должен использовать это. Большое спасибо, сэр!
Что ж, когда я пытаюсь напечатать newUser.getRole(), он печатает null. Тогда, может быть, я хочу спросить ваше мнение, как лучше всего это сделать (наиболее часто используемое)? Цель: я просто хочу сохранить идентификатор роли пользователя в пользовательской таблице внутри столбца role_id.