Создавайте пользовательские аннотации для разных выходных данных из одного и того же класса POJO.

Итак, у меня есть класс POJO, который сопоставляет документ json (который я получаю) с объектом java.

@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE)
public class Product implements Serializable, UniqueKeyAware {

    private static final long serialVersionUID = -7311148654827944888L;

    @JsonIgnore
    private String uniqueKey;

    @JsonProperty("uniqueKey")
    private String uniqueKeyV2;

    @JsonProperty("gtin")
    private String gtin;

    @JsonProperty("printedGtin")
    private String printedGtin;

    @JsonProperty("tpnb")
    private String tpnb;

    @JsonProperty("tpnc")
    private String tpnc;

    @JsonProperty("tpna")
    private String tpna;

    @JsonProperty("itemNumber")
    private String itemNumber;

    @JsonProperty("catId")
    private String catId;

    @JsonProperty("styleCode")
    private String styleCode;

    @JsonProperty("description")
    private String description;

    @JsonProperty("brand")
    private String brand;

    @JsonProperty("isOwnLabel")
    private Boolean isOwnLabel;

    @JsonProperty("regulatedProductName")
    private String regulatedProductName;

    @JsonProperty("country")
    private List<Country> region;

    ... // remove for simplicity

Я хочу, чтобы лучший способ создать 4 отдельных документа из json.

Итак, давайте определим 4 класса, которые являются подмножествами этого класса pojo.

  • Общественный
  • Частный
  • Партнер
  • Привилегия

Для удобства настройки мне нужны пользовательские аннотации, такие как @public, @private, @partner, @priviledge, которые я буду писать над каждым полем. И во время выполнения, если я укажу, например. public, экземпляр будет создан только для тех полей, над которыми написаны аннотации @public.

Мне нужно реализовать это. Я думаю, что это возможно, создав несколько хуков в библиотеке Джексона. Пожалуйста, мне нужно сделать это за один день, может кто-нибудь просто подсказать, как это сделать.

Конечный продукт должен выглядеть так:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE)
public class Product implements Serializable, UniqueKeyAware {

    private static final long serialVersionUID = -7311148654827944888L;

    @JsonIgnore
    private String uniqueKey;

    @JsonProperty("uniqueKey") @public @private
    private String uniqueKeyV2;

    @JsonProperty("gtin") @public
    private String gtin;

    @JsonProperty("printedGtin") @public
    private String printedGtin;

    @JsonProperty("tpnb")@private
    private String tpnb;

    @JsonProperty("tpnc")@private
    private String tpnc;

    @JsonProperty("tpna")@priviledge
    private String tpna;

    ... // removed for simplicity

и выше, например. Экземпляр @public будет иметь только атрибуты uniqueKey, gtin, printGtin.


person prakharjain    schedule 14.12.2017    source источник


Ответы (1)


Я нашел решение. Нам нужна аннотация @JsonView, уже присутствующая в jackson. Сначала нам нужно создать класс представления следующим образом:

public class Views
{
    public static class Public{};
    public static class Partner extends Public{};
    public static class Priviledge extends Partner {};
    public static class Private extends Priviledge {};
}

Тогда наш основной класс продуктов будет таким.

@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE)
public class MyProduct implements Serializable, UniqueKeyAware {

    private static final long serialVersionUID = -7311148654827944888L;

    @JsonIgnore
    private String uniqueKey;

    @JsonProperty("uniqueKey")
    @JsonView(Views.Partner.class)
    private String uniqueKeyV2;

    @JsonProperty("gtin")
    @JsonView(Views.Public.class)
    private String gtin;

    @JsonProperty("printedGtin")
    @JsonView(Views.Public.class)
    private String printedGtin;

    @JsonProperty("tpnb")
    @JsonView(Views.Public.class)
    private String tpnb;

    // skipped other attributes and getter setter

Основная функция будет выглядеть так:

ObjectMapper mapper = new ObjectMapper();
MyProduct product = mapper.readerWithView(Views.Public.class).forType(MyProduct.class).readValue(json)
person prakharjain    schedule 15.12.2017