为同一 POJO 的不同输出创建自定义注释 class

Create custom annotations for different output from same POJO class

所以我有一个 POJO class,它将 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

我想要的是从 json.

中创建 4 个单独文档的最佳方法

所以,让我们定义 4 个 class,它们是这个 pojo class.

的子集

出于可配置性目的,我需要自定义注释,如@public、@private、@partner、@priviledge,我将在每个字段上方写上这些注释。在运行时,如果我指定例如public class,只会为上面写有@public注解的那些字段创建实例。

我需要实现这个。我认为这可以通过在 jackson 库中创建一些挂钩来实现。请我一天之内完成,谁能指导一下如何做。

最终产品应该是这样的:

@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、printedGtin 作为唯一属性。

我找到了解决方案。我们需要的是 @JsonView 注释已经存在于 jackson 中。我们首先需要像这样创建视图 class:

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 {};
}

那么,我们的主打产品class就是这样了

@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)