使用 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
抱歉任何打字错误,因为我使用的是记事本++。
我有一个使用 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
抱歉任何打字错误,因为我使用的是记事本++。