Клиент Quarkus REST избегает JSON сериализации пустых полей - PullRequest
1 голос
/ 13 июля 2020

Мне нужно отправить удаленной службе запрос на обновление, чтобы обновить некоторые поля. Удаленная служба использует тип содержимого application/json, поэтому я реализовал свой клиент для отдыха, например:

@RegisterRestClient
@Path("/api/v1")
@Produces("application/json")
@Consumes("application/json")
@ApplicationScoped
public interface ServiceClient {
    @POST
    @Path("/path_to_update/{uuid}")
    Response updateAttributes(
        @PathParam("uuid") String uuid,
        Attributes attributes
    );
}


@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public class Attributes {
    private AttributesA a;
    private AttributesB b;
}

@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public class AttributesA {
    private String field1;
}

@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public class AttributesB {
    private String field2;
    private String field3;
}

Мне нужно обновить только подмножество полей. возможно field1 и field3. Таким образом, в этом случае field2 будет установлено на null.

Удаленная служба не принимает null в качестве значения параметра, поэтому мне нужно избегать сериализации всех полей, которые имеют null значение.

В моем проекте используется jsonb, и я уже безуспешно пытался аннотировать классы модели с помощью JsonbNillable.

Есть ли способ настроить остальных клиентов в чтобы избежать сериализации нулевых полей?

1 Ответ

0 голосов
/ 13 июля 2020

Я бы посоветовал отказаться от Lombok для ваших классов данных, чтобы прояснить ситуацию, когда что-то работает не так, как ожидалось. В этом случае вы можете написать более лаконичный код без ломбока, используя стратегию видимости по умолчанию JSON -B, что означает, что поля publi c автоматически [де] удаляются и не нуждаются в геттерах / сеттерах.

Итак, ваши классы данных могут быть:

public class Attributes {
    public AttributesA a;
    public AttributesB b;
}

public class AttributesA {
    public String field1;
}

public class AttributesB {
    public String field2;
    public String field3;
}

Есть ли способ настроить остальной клиент, чтобы избежать сериализации нулевых полей?

По умолчанию JSON -B не сериализует нулевые значения. Итак, если бы мы сделали:

Attributes empty = new Attributes();
String json = jsonb.toJson(empty);
System.out.println(json); // "{}"

, мы бы просто получили пустой JSON объект {}. Аннотация @JsonbNillable полезна, если вы do хотите сериализовать нулевые значения как null.

...