Rest POJO类的条件命名

Rest POJO类的条件命名,rest,serialization,pojo,annotated-pojos,Rest,Serialization,Pojo,Annotated Pojos,我们的问题是,我们的服务GET/services/v1/myobject返回名为Xyz的对象。此表示由多个现有客户端使用 新服务GET/services/v2/myobject需要公开完全相同但名称不同的对象,比如XyzLmn 现在一个明显的解决方案是创建两个类Xyz和XyzLmn,然后将Xyz复制到XyzLmn中,并在v2中公开XyzLmn 我在寻找的是,我如何保持相同的java pojo类Xyz,并有条件地将其序列化为XyzLmn或Xyz?您是否尝试在域对象上添加@JsonIgnorePro

我们的问题是,我们的服务
GET/services/v1/myobject
返回名为
Xyz
的对象。此表示由多个现有客户端使用

新服务
GET/services/v2/myobject
需要公开完全相同但名称不同的对象,比如
XyzLmn

现在一个明显的解决方案是创建两个类
Xyz
XyzLmn
,然后将
Xyz
复制到
XyzLmn
中,并在
v2
中公开
XyzLmn


我在寻找的是,我如何保持相同的java pojo类
Xyz
,并有条件地将其序列化为
XyzLmn
Xyz

您是否尝试在域对象上添加@JsonIgnoreProperties(ignoreUnknown=true)?

一个解决方案是:

  • 编写一个发出
    XyzLmn
  • 有条件地注册客户序列化程序

    public class XyzWrapperSerializer extends StdSerializer<Item> {
    
    public ItemSerializer() {
        this(null);
    }
    
    public ItemSerializer(Class<Item> t) {
        super(t);
    }
    
    @Override
    public void serialize(
      Item value, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException {
    
        jgen.writeStartObject();
        jgen.writeNumberField("XyzLmn", value.id);
        jgen.writeEndObject();
    } }
    

  • 我不是“GET/services/v1/myobject”的消费者,我是它的制作人。你试过使用Java泛型类型吗?例如@JsonIgnoreProperties(ignoreUnknown=true)@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)公共类MyEntity{private String version;private T versiondentity;}
    XyzWrapper myItem = new XyzWrapper(1, "theItem", new User(2, "theUser"));
    ObjectMapper mapper = new ObjectMapper();
    
    SimpleModule module = new SimpleModule();
    module.addSerializer(XyzWrapper.class, new XyzWrapperSerializer());
    mapper.registerModule(module);
    
    String serialized = mapper.writeValueAsString(myItem);