LINUX.ORG.RU

Spring: как конвертировать JSON-объект с id внешнего ключа вместо объекта

 , , ,


0

1

Приветствую.
Имею модели 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);
	}

★★

И каких действий вы от джексона хотите? На моменте разбора запроса у него ничего кроме запроса нет, вы же сами у него отобрали объект и положили число. Если вы считаете, что он сам должен догадаться сходить в базу и забрать оттуда нужную сущность, то вынужден вас разочаровать, это придётся делать вам. Наследуйтесь от ObjectIdResolver'а (кажется) и вперёд.

ya-betmen ★★★★★ ()
Ответ на: комментарий от ya-betmen

Спасибо, но по ObjectIdResolver что-то ничего не гуглится, кроме хелпа API.
Вот предлагают наследоваться от JsonDeserializer и аннотировать модель так:

@JsonDeserialize(using = ItemDeserializer.class)
Это оно? или есть более красивое решение

POLTER ★★ ()
Последнее исправление: POLTER (всего исправлений: 1)
Ответ на: комментарий от POLTER

Да, попутал.

Конечно я не очень понимаю смысл использования тут ид, по идее это способ для обхода циклических ссылок.

ya-betmen ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.