Java 8, Jackson, REST API: значение, которое установлено, равно нулю или отсутствует вообще - PullRequest
0 голосов
/ 07 декабря 2018

Мне нужно вызвать 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, который подключается через какую-то шутливую аннотацию

или ...!?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...