使用 spring mvc 更改基数时处理追溯兼容性

Handle retrocompatility when changing cardinality with spring mvc

我有一个使用 SpringMvc 创建的现有服务。 他已经习惯并接受了这样的对象:

  public class MyDto{
   private AType a;
   private BType b;

   //and corresponding getters and setters
   
 }

和相应的Json

{
   a: {},
   b: {}
}

我想将 A 的基数更改为:

  public class MyDto{
   private List<AType> a;
   private BType b;

   //and corresponding getters and setters
   
 }

和对应的json:

{
   a: [{}],
   b: {}
}

但我想继续接受第一个表示的 json,因为我无法轻松更新 api 的所有消费者。

我的第一个想法是创建我的 api 的第 2 版,因为这是重大更改。但我认为这太多了,因为如果 api 消费者发送一个元素,我可以只创建一个元素列表。

但我不知道我是否可以用 spring mvc 做到这一点。

是的,我认为如果您使用 @JsonDeserialize 并进行少量自定义就可以了。

public class MyDto{
   @JsonDeserialize(using = CustomDeserializer.class)
   private List<AType> a;
   private BType b;

   //and corresponding getters and setters
   
 }

这里是 CustomDeserializer

public class CustomDeserializer extends JsonDeserializer<List<AType>> {
    @Override
    public List<AType> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {      
        if(jsonParser.isExpectedStartObjectToken()){
            final AType aType = jsonParser.readValueAs(new TypeReference<AType>() {});
            return Arrays.asList(aType);
        }
        return jsonParser.readValueAs(new TypeReference<List<AType>>() {}); 
    }
}

我的想法很简单:如果json从Object Token开始, 我们将其转换为 AType 并添加到列表,然后添加到 return 列表。 如果不是,则必须以array开头,我们将其转换为List

抱歉任何打字错误,因为我使用的是记事本++。