Spring Hibernate не получил значение параметра

Я пытаюсь сделать вызов 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, как указано выше.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы получаете 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.

Что ж, когда я пытаюсь напечатать newUser.getRole(), он печатает null. Тогда, может быть, я хочу спросить ваше мнение, как лучше всего это сделать (наиболее часто используемое)? Цель: я просто хочу сохранить идентификатор роли пользователя в пользовательской таблице внутри столбца role_id.

Akza 17.04.2019 18:15

@Akza, если вас не волнует имя роли, просто удалите его отовсюду, если оно вам небезразлично, вы должны откуда-то его взять. Вы пробовали мой фрагмент выше?

burm87 17.04.2019 18:43

Что ж, это работает. Я думаю, что я просто должен использовать это. Большое спасибо, сэр!

Akza 17.04.2019 18:52

Другие вопросы по теме