Запрос API к отношению ManyToOne - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь создать API, который имеет отношение ManyToOne.Речь идет о сотруднике и подразделении.Вот что у меня есть:

@Entity
@Table
public class Employee {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    private Long Id;
    private String name;
    @ManyToOne(fetch=FetchType.LAZY)
    private Department department;
    //SETTERS AND GETTERS, TWO CONSTRUCTORS 
}

Класс отдела

 @Entity
@Table
public class Department {

    @Id
    @GeneratedValue
    private Long Id;
    private String name;
    //SETTERS AND GETTERS, TWO CONSTRUCTORS 
}

Контролер сотрудника

@RestController
public class EmployeeController {

    @Autowired
    EmployeeService employeeService;

    @PostMapping("/employee")
    public Employee create (@RequestBody Employee employee){

          return employeeService.create(employee);
    }
}

Контролер отдела

 @RestController
 public class DepartmentController {

     @Autowired
     private DepartmentService departmentService;

     @PostMapping("/departments")
     public Department create(@RequestBody Department department) {
       return departmentService.create(department);
   }
}

Мне нужнодобавить отдел, а затем добавить и сотрудника, который принадлежит этому отделу.

Это запрос POST для Отдела, и он работает.

{
    "id": 2,
    "name": "Depto"             
 }

Мне нужно добавить этот отдел к сотруднику

 {
     "id": 2,
     "name": "Employee",
     "department": 2
 }

Это ошибка, которую яполучил:

 .HttpMessageNotReadableException: Could not read document: Cannot construct instance of 'mypackage.Department' (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (2)

1 Ответ

2 голосов
/ 08 мая 2019

Поле department в классе Employee является экземпляром Department, а не целым числом.Так что JSON, который вы размещаете, неверен.Фактически, это плохая архитектурная практика - использовать тот же класс для сохранения в БД, что и тот, который вы отправляете через вызовы REST.

Если вы разделяете их (делаете объект REST DTO), тогда вы можете получить идентификатор(2) найдите отдел с идентификатором 2, а затем вставьте его в новый объект Employee и сохраните его в базе данных.

Edit : вы можете создать класс EmployeeDTO:

public class EmployeeDTO {
    private Long id;
    private String name;
    private Long departmentId;

    ...  // getters
}

А у вашего контроллера может быть конечная точка примерно такая:

@PostMapping("/employee")
public Employee create (@RequestBody EmployeeDTO employeeDTO){

    Department department = departmentService.get(employeeDTO.getDepartmentId());

    Employee employee = new Employee();
    employee.setId(employeeDTO.getId());
    employee.setName(employeeDTO.getName());
    employee.setDepartment(department);

    return employeeService.create(employee);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...