Мне нужно вызвать REST API (метод PATCH).В теле запроса для этого вызова патча есть два значения "foo" и "bar".foo и bar ссылаются на объекты типа Foo и Bar (которые оба являются классами в Java).
Для foo есть две возможности:
- Если foo отсутствует в запросеbody, значение foo на сервере не изменяется.
- Если foo присутствует, значение foo на сервере обновляется.
Но для bar есть три возможности:
- Если в теле запроса отсутствует bar, значение bar на сервере не изменяется.
- Если присутствует bar, сервер устанавливает значение bar в значениеновое значение (или создает новую полосу).
- Если bar имеет значение NULL, сервер устанавливает свое внутреннее состояние на «нет полосы».
Примеры JSON
{
"foo": {}
}
{
"foo": {},
"bar": {}
}
{
"foo": {},
"bar": null
}
{
"bar": {}
}
{
"bar": {}
}
Я ищу способ выразить это в Java 8, используя Джексона.Но я могу только добиться того, чтобы значение в JSON или опускалось как нулевое.
Класс сущности должен выглядеть примерно так:
public class Entity {
private Foo foo;
private Bar bar;
public Foo getFoo() {
return foo;
}
public void setFoo(Foo foo) {
this.foo = foo;
}
public Bar getBar() {
return bar;
}
public void setBar(Bar bar) {
this.bar = bar;
}
}
В другом месте сопоставление выполняется:
ObjectMapper objectMapper = new ObjectMapper();
try {
Entity e = new Entity();
e.setFoo(new Foo());
System.out.println(objectMapper.writeValueAsString(e));
e.setBar(new Bar());
System.out.println(objectMapper.writeValueAsString(e));
} catch (JsonProcessingException e1) {
e1.printStackTrace();
}
Вывод выглядит следующим образом
{"foo":{},"bar":null}
{"foo":{},"bar":{}}
Если я добавлю
@JsonInclude(JsonInclude.Include.NON_ABSENT)
к классу Entity, вывод изменится на
{"foo":{}}
{"foo":{},"bar":{}}
Неважно, если я использую обнуляемые ссылки или опционально.Есть только два состояния.Значение установлено или нет.«Не установлено» может быть выражено в JSON через Джексона как нулевое или как пропущенное значение.Чего мне не хватает, так это способа сделать либо: в одной ситуации опустить его (не там) и установить его как ноль в другой (там, но без значения).Как я могу выразить это на Java с помощью Джексона?Возможно ли это или мне не повезло?
Что-то вроде
public class Entity {
private Foo foo;
private Magic<Bar> bar;
...
или дополнительный bool, который подключается через какую-то шутливую аннотацию
или ...!?