powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC: как конвертировать входящий JSON-объект с внешним ключем к сущности
7 сообщений из 7, страница 1 из 1
Spring MVC: как конвертировать входящий JSON-объект с внешним ключем к сущности
    #38714960
polter.rnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.
Имею модели Device -> (many-to-one) -> DeviceType.

Device.java:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
@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:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
@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:

Код: javascript
1.
[{"id":1,"code":1234567890.00,"lastConfig":null,"model":"TR-200","deviceType":1}]



Собственно, вопрос. Как теперь сделать PUT с таким JSON? Как я понимаю, проблема в том, что вместо deviceType я ставлю его id, а конвертер не может сконвертировать такое, т.к. ожидает там объект. Такой вот контроллер дает мне ошибку 400, что ожидаемо. Но как это обойти?


Код: java
1.
2.
3.
4.
5.
    @RequestMapping(method = RequestMethod.PUT)
    @ResponseStatus(HttpStatus.OK)
    public void update(@RequestBody Device resource) {
        deviceService.update(resource);
    }



Гуглится решение с использованием JsonDeserializer и вручную преобразовывать json в объект.
Также читал про конвертеры, создать унаследованный от org.springframework.core.convert.converter.Converter класс и в нем преоразовывать из String в DeviceType (т.е. преобразовываем не весь json, а только конкретное поле). Но я что-то не пойму, как его привязать к соответствующему полю.
...
Рейтинг: 0 / 0
Spring MVC: как конвертировать входящий JSON-объект с внешним ключем к сущности
    #38714976
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте ответим на концептуальный вопрос.
У нас есть DeviceType.id но мы из него хотим иметь DeviceType.
Так? Тогда логичнее бы было иметь JSON вида
Код: javascript
1.
{"deviceType":{"id":1}}


Почему нет?
Второй вопрос. Нужно ли нам в вашем сценарии полный DeviceType со всеми свойствами. Или достаточно только id, чтобы заперсистить в БД как FK device.adev_type?

Вот это стремный маппинг
Код: java
1.
2.
3.
 @OneToMany(mappedBy="deviceType", cascade = CascadeType.REMOVE)
    @JsonIgnore
    private List<Device> devices;


Так как количество девайсов одного типа ничем сверху не ограничено, это раз. Ещё и значение, обычно, часто изменяющееся - это два.
...
Рейтинг: 0 / 0
Spring MVC: как конвертировать входящий JSON-объект с внешним ключем к сущности
    #38715000
polter.rnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczДавайте ответим на концептуальный вопрос.
У нас есть DeviceType.id но мы из него хотим иметь DeviceType.
Так? Тогда логичнее бы было иметь JSON вида
Код: javascript
1.
{"deviceType":{"id":1}}


Почему нет?

В принципе можно, тут я ничем не ограничен, кроме того, что ничего, кроме id не известно.

BlazkowiczВторой вопрос. Нужно ли нам в вашем сценарии полный DeviceType со всеми свойствами. Или достаточно только id, чтобы заперсистить в БД как FK device.adev_type?
Все свойства не нужны, может измениться только id

BlazkowiczВот это стремный маппинг
Код: java
1.
2.
3.
 @OneToMany(mappedBy="deviceType", cascade = CascadeType.REMOVE)
    @JsonIgnore
    private List<Device> devices;


Так как количество девайсов одного типа ничем сверху не ограничено, это раз. Ещё и значение, обычно, часто изменяющееся - это два.
Я догадывался.. Не помню уж откуда он взялся, может, сам сгенерировался. Мне получать девайсы по типу не нужно, так что уберу его
...
Рейтинг: 0 / 0
Spring MVC: как конвертировать входящий JSON-объект с внешним ключем к сущности
    #38715008
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polter.rnd,

Ну, дык. Проблема решена?
...
Рейтинг: 0 / 0
Spring MVC: как конвертировать входящий JSON-объект с внешним ключем к сущности
    #38715031
polter.rnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Пока нет возможности проверить :)
Получается, указав только id без остальных свойств в JSON-e, Jackson сможет правильно сконвертировать?
Значит решена, спасибо! Вечером попробую.
...
Рейтинг: 0 / 0
Spring MVC: как конвертировать входящий JSON-объект с внешним ключем к сущности
    #38715038
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polter.rndПолучается, указав только id без остальных свойств в JSON-e, Jackson сможет правильно сконвертировать?

А что значит "правильно\не правильно". Будет экземпляр DeviceType, у которого все свойства null кроме id. JPA должно быть достаточно такого объекта, чтобы просто поставить значение в auto_devices.adev_type
...
Рейтинг: 0 / 0
Spring MVC: как конвертировать входящий JSON-объект с внешним ключем к сущности
    #38715041
polter.rnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Ясно, тогда это то что надо!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC: как конвертировать входящий JSON-объект с внешним ключем к сущности
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]