Spring - игнорировать свойства JSON в запросе, но не в ответе

Это действительный объект Entry, полученный из запроса ПОЛУЧАТЬhttp://domain/entry/{id}:

{
    "id": 1,
    "description": "ML Books",
    "dueDate": "2017-06-10",
    "paymentDate": "2017-06-10",
    "note": "Distribution de lucros",
    "value": 6500,
    "type": "INCOME",
    "category": {
        "id": 2,
        "name": "Food"
    },
    "person": {
        "id": 3,
        "name": "User",
        "active": true,
        "address": {
            // properties suppressed for better reading
        }
    }
}

В запросе POST я хочу сохранить внешние объекты Категория и Человек, просто отправив соответствующие идентификаторы, например:

{
    "description": "NEW ENTRY",
    "dueDate": "2019-06-22",
    "paymentDate": "2019-06-22",
    "note": "Coloured pens",
    "value": 10,
    "type": "INCOME",
    "categoryId": 5,
    "personId": 5
}

Чтобы сохранить объекты без того, чтобы Spring говорил, что объекты человека и категории были null, я добавил к ним @JsonIgnore в модели и следовал потоку это.

Частично получилось:

  • теперь он сохраняет объект только с идентификатором
  • но не извлекает объект в запросах GET

Теперь при получении записи с тем же запросом ПОЛУЧАТЬhttp://domain/entry/{id}:

{
    "id": 23,
    "description": "Pens",
    "dueDate": "2019-06-22",
    "paymentDate": "2019-06-22",
    "note": "Coloured pens",
    "value": 10,
    "type": "INCOME",
    "categoryId": null, // It supposed to bring the entire object
    "personId": null // It supposed to bring the entire object
}

PS: categoryId и personId отмечены @Transient, поэтому они нулевые.

Итак, как указано в заголовке, я хочу игнорировать свойства «Категория» и «Человек» только в запросе POST (сохранение их), а не в запросах GET (их получение).

Любая помощь будет приветствоваться. заранее спасибо

Вы используете один и тот же класс для представления трех очень разных вещей: 1. вашей модели постоянства, 2. данных JSON, которые обещает вернуть ваш HTTP API (и которые не должны меняться, если вы решите изменить свое мнение о реализации ваша модель постоянства), 3. данные JSON, которые ваш REST API ожидает для создания записи. Используйте три разных класса для каждой из этих трех разных вещей, и все будет намного понятнее, проще, гибче, потому что они развязаны.

JB Nizet 22.06.2019 18:58

Итак, вы предлагаете создавать разные модели для каждого случая (GET, POST)? Аннотации из Spring/Jackson не могут справиться с этим?

tomrlh 22.06.2019 19:41
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
160
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Джексон добавил аргументы аннотаций READ_ONLY и ЗАПИСАТЬ_ТОЛЬКО для JsonProperty. Таким образом, вы также можете сделать что-то вроде:

@JsonProperty(access = JsonProperty.Access.READ_ONLY)
@Id
@GeneratedValue
private  Long  id;

Другие вопросы по теме