Я разрабатываю REST API с использованием Java и Spring Boot.
Существуют две сущности с отношение один к одному :
Пользователь:
@Entity
@Table(name = "users")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@Column(name = "email", nullable = false, unique = true)
private String email;
@OneToOne(fetch = FetchType.LAZY,
cascade = CascadeType.ALL,
mappedBy = "employee")
@JsonBackReference
private Company company;
// constructors, getters & setters...
И Компания:
@Entity
@Table(name = "companies")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "company_name", nullable = false)
private String companyName;
@Column(name = "company_info", nullable = false)
private String companyInfo;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_at", nullable = false)
private Date createdAt;
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "employee_id", nullable = false)
@JsonManagedReference
private User employee;
// constructors, getters & setters...
Я хочу иметь возможность создавать Компании с помощью метода POST , поэтому я создал один в CompanyController (я опускаю методы GET в контроллере, поскольку они работают должным образом):
@RestController
@RequestMapping(value = "/api/v1")
public class CompanyController {
private static final Logger logger = LoggerFactory.getLogger(CompanyController.class);
@Autowired
private CompanyRepository companyRepository;
@PostMapping(path = "company", produces = "application/JSON")
public ResponseEntity<?> createCompany(@RequestBody Company company){
logger.info("Request to save new Company: {}", company);
Company result = companyRepository.save(company);
return ResponseEntity.ok().body(result);
}
Метод createCompany
отлично работает, когда я отправляю запрос с JSON, как показано ниже:
{
"companyName" : "Big Client Company 2",
"companyInfo" : "unspecified",
"employee" : {
"id": 17,
"firstName": "someName",
"lastName": "someLastName",
"email": "someEmail@a.ru"
}
}
Однако я хочу иметь возможность отправлять JSON без всего тела поля сотрудника, но спросто идентификатор:
{
"companyName" : "Big Client Company 2",
"companyInfo" : "unspecified",
"employee" : 17
}
Когда я делаю это, я получаю ошибку:
Ошибка синтаксического анализа JSON: Невозможно создать экземпляр model.User
(хотя существует хотя бы один Создатель)): нет int / Int-аргумент конструктор / фабричный метод для десериализации из числового значения (17)
Так что вопрос есть ли способ сделать это без изменения Класс компании «сотрудник» в строку (и избавление от отношения «один к одному»)?
Я пытался найти примеря пишу собственные десериализаторы JSON, но мне не удалось ни одного подходящего для меня.