在响应中添加新字段时的向后兼容性
Backward compatibility when adding a new field in response
我正在为我的 request/response 类 使用 Java 不可变对象,看起来像这样:
@JsonDeserialize(builder = ImmutableMyRequest.Builder.class)
@Immutable
public interface MyRequest {
@Nullable String getA();
@NotNull String getB();
...
}
现在我需要为我的请求添加一个新字段:
@JsonDeserialize(builder = ImmutableMyRequest.Builder.class)
@Immutable
public interface MyRequest {
@Nullable String getA();
@NotNull String getB();
@Nullable String getC(); // Edit
...
}
据我所知,这不应该破坏兼容性,旧客户端应该简单地忽略新字段,但是当我将旧版本与新请求一起使用时,它失败了:
Unexpected status. Expected: 200. Actual: 400. Response: InboundJaxrsResponse{context=ClientResponse{method=POST, uri=http://some.url.here, status=400, reason=Bad Request}}
我正在使用 javax.ws.rs.client.Invocation.Builder
来 post 我的请求。
这里有什么帮助吗?
您看到此错误是因为旧版本没有忽略未知属性。较旧的服务器需要将 @JsonIgnoreProperties(ignoreUnknown = true)
作为接口的注释,以便它忽略已在后续版本中添加的 属性。
如果您无法更改旧版本,则无法解决此问题,因为旧服务器的设计不会忽略未知属性。
我正在为我的 request/response 类 使用 Java 不可变对象,看起来像这样:
@JsonDeserialize(builder = ImmutableMyRequest.Builder.class)
@Immutable
public interface MyRequest {
@Nullable String getA();
@NotNull String getB();
...
}
现在我需要为我的请求添加一个新字段:
@JsonDeserialize(builder = ImmutableMyRequest.Builder.class)
@Immutable
public interface MyRequest {
@Nullable String getA();
@NotNull String getB();
@Nullable String getC(); // Edit
...
}
据我所知,这不应该破坏兼容性,旧客户端应该简单地忽略新字段,但是当我将旧版本与新请求一起使用时,它失败了:
Unexpected status. Expected: 200. Actual: 400. Response: InboundJaxrsResponse{context=ClientResponse{method=POST, uri=http://some.url.here, status=400, reason=Bad Request}}
我正在使用 javax.ws.rs.client.Invocation.Builder
来 post 我的请求。
这里有什么帮助吗?
您看到此错误是因为旧版本没有忽略未知属性。较旧的服务器需要将 @JsonIgnoreProperties(ignoreUnknown = true)
作为接口的注释,以便它忽略已在后续版本中添加的 属性。
如果您无法更改旧版本,则无法解决此问题,因为旧服务器的设计不会忽略未知属性。