我可以在服务器端向响应添加新字段并且旧客户端不会因杰克逊反序列化而中断吗?



我在服务器上有一个类:

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。我可以更改服务器或新的客户端代码。

如何使用杰克逊序列化程序使其工作?

不同的格式:

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

相同的格式:

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

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

  1. @JsonIgnoreProperties(ignoreUnknown = true)添加到旧客户端中的 POJO
  2. 如果您不能修改 POJO,但可以访问 ObjectMapper: objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  3. 如果你可以访问ObjectMapper,但不想影响所有其他POJO,你可以只为那个POJO混合
  4. 注释。

最新更新