代码之家  ›  专栏  ›  技术社区  ›  prakharjain

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

  •  1
  • prakharjain  · 技术社区  · 6 年前

    所以我有一个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
    

    我想要的是用json创建4个单独文档的最佳方法。

    所以,让我们定义4个类,它们是这个pojo类的子集。

    • 平民的
    • 私有的
    • 搭档
    • Priviledge公司

    为了便于配置,我需要自定义注释,如@public、@private、@partner、@priviledge,我将在每个字段上方编写这些注释。在运行时,如果我为例如public类指定,那么将只为上面写有@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 instance将具有uniqueKey、gtin、printedGtin作为唯一属性。

    1 回复  |  直到 6 年前
        1
  •  1
  •   prakharjain    6 年前

    我找到了解决办法。我们需要的是jackson中已经存在的@JsonView注释。我们首先需要创建如下视图类:

    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)