我可以在服务器端向响应中添加一个新字段,而旧客户端是否可以打破杰森反序列化?

时间:2016-05-20 09:43:48

标签: java json serialization jackson deserialization

我在服务器上有一个课程:

Class A{
int x;
int y;
// getters and setters
}

在旧客户端

Class A{
int x;
}

在新客户端

Class A{
int x;
int y;
}

现在我无法更改旧的客户端代码,客户端会给出org.codehaus.jackson.map.exc.UnrecognizedPropertyException。 我可以更改服务器或新的客户端代码。

如何使用jackson序列化器来完成这项工作?

1 个答案:

答案 0 :(得分:1)

格式不同:

您可以在服务器上使用Views在运行时决定要包含哪些属性。然后,新客户端可以请求与旧客户端相同的内容,但使用不同的参数/标头或通过不同的API路径,只使用具有新属性的新视图。

格式相同:

如果旧客户端不支持新格式,则不能简单地强制它支持它而不修改客户端。事实上,如果你可以做这样的事情,那将是非常危险的,因为这意味着现有的应用程序不能依赖于它们的格式限制。

但是,如果您可以修改旧客户端,您可以执行以下操作:

  1. @JsonIgnoreProperties(ignoreUnknown = true)添加到旧客户端的POJO
  2. 如果您无法修改POJO,但可以访问ObjectMapper:objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  3. 如果你可以访问ObjectMapper,但又不想影响所有其他POJO,你可以mix-in the annotation仅针对那个POJO