Приветствую.
Имею модели Device -> (many-to-one) -> DeviceType.
Device.java:
@Entity
@Table(name="auto_devices")
@NamedQuery(name="Device.findAll", query="SELECT d FROM Device d")
public class Device implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="adev_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="adev_code")
private BigDecimal code;
@Column(name="adev_last_config")
private Timestamp lastConfig;
@Column(name="adev_model")
private String model;
//bi-directional many-to-one association to DeviceType
@ManyToOne
@JoinColumn(name="adev_type")
private DeviceType deviceType;
// тут всякие геттеры-сеттеры...
/* Сериализуем как ID */
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
@JsonIdentityReference(alwaysAsId=true)
public DeviceType getDeviceType() {
return this.deviceType;
}
public void setDeviceType(DeviceType deviceType) {
this.deviceType = deviceType;
}
}
DeviceType.java:
@Entity
@Table(name="auto_device_types")
@NamedQuery(name="DeviceType.findAll", query="SELECT d FROM DeviceType d")
public class DeviceType implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="adt_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="adt_config")
@Lob
@Type(type="org.hibernate.type.StringClobType")
private String config;
@Column(name="adt_config_time")
private Timestamp configTime;
@Column(name="adt_name")
private String name;
//bi-directional many-to-one association to Device
@OneToMany(mappedBy="deviceType", cascade = CascadeType.REMOVE)
@JsonIgnore
private List<Device> devices;
// тут геттеры-сеттеры
}
Для Device генерируется следующий JSON:
[{"id":1,"code":1234567890.00,"lastConfig":null,"model":"TR-200","deviceType":1}]
Собственно, вопрос. Как теперь сделать PUT с таким JSON? Как я понимаю, проблема в том, что вместо deviceType я ставлю его id, а конвертер не может сконвертировать такое, т.к. ожидает там объект. Такой вот контроллер дает мне ошибку 400, что ожидаемо. Но как это обойти? Читал про конвертеры, типа преобразовать String->DeviceType. Но я что-то не пойму, как его привязать к соответствующему полю.
@RequestMapping(method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
public void update(@RequestBody Device resource) {
deviceService.update(resource);
}