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

有没有办法从具有对象合成的pojo自动生成展平pojo

  •  1
  • Hakan54  · 技术社区  · 7 年前

    我需要将文档存储到Elasticsearch索引中,因此我定义了一个映射。从我的java客户机中,我需要为它提供pojo,它看起来像Compony类。它有许多重复的值。我可以使用对象合成模式来解决这个问题,但Elasticsearch无法处理这种结构,因此它需要一个扁平的结构。

    class Company {
        private String postalstreetName;
        private String postalHouseNumer;
        private String postalHouseLetter;
        private String postalHouseNumberAddition;
        private String postalZipCode;
        private String postalCity;
        private String postalCountry;
    
        private String visitorstreetName;
        private String visitorHouseNumer;
        private String visitorHouseLetter;
        private String visitorHouseNumberAddition;
        private String visitorZipCode;
        private String visitorCity;
        private String visitorCountry;
    
        private String establishmentstreetName;
        private String establishmentHouseNumer;
        private String establishmentHouseLetter;
        private String establishmentHouseNumberAddition;
        private String establishmentZipCode;
        private String establishmentCity;
        private String establishmentCountry;
    }
    

    实际上我想要下面的pojo,并以某种方式自动生成上面具有相同命名结构的pojo。

    class Address {
        private String streetName;
        private String houseNumer;
        private String houseLetter;
        private String houseNumberAddition;
        private String zipCode;
        private String city;
        private String country;
    }
    
    class Company {
        private Address postalAddress;
        private Address visitorAddress;
        private Address establishmentAddress;
    }
    

    有人知道这样做是否可能,从具有对象组合的pojo自动生成一个扁平pojo,所有字段都有一个名称前缀?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Hakan54    7 年前

    @JsonUnwrapped 指向具有前缀值的字段,因此我的公司类如下所示:

    class Company {
        @JsonUnwrapped(prefix = "postal")
        private Address postalAddress;
        @JsonUnwrapped(prefix = "visitor")
        private Address visitorAddress;
        @JsonUnwrapped(prefix = "Establishment")
        private Address establishmentAddress;
    }
    
    

    结果将是:

    {
      "postalStreetName":"",
      "postalHouseNumer":"",
      "postalHouseLetter":"",
      "postalHouseNumberAddition":"",
      "postalCity":"",
      "postalCountry":"",
      "visitorStreetName":"",
      "visitorHouseNumer":"",
      "visitorHouseLetter":"",
      "visitorHouseNumberAddition":"",
      "visitorCity":"",
      "visitorCountry":"",
      "establishmentStreetName":"",
      "establishmentHouseNumer":"",
      "establishmentHouseLetter":"",
      "establishmentHouseNumberAddition":"",
      "establishmentCity":"",
      "establishmentCountry":""
    }