Java 在响应中添加新字段时的向后兼容性

Java 在响应中添加新字段时的向后兼容性,java,backwards-compatibility,immutables-library,Java,Backwards Compatibility,Immutables Library,我在请求/响应类中使用Java不可变表,如下所示: @JsonDeserialize(builder = ImmutableMyRequest.Builder.class) @Immutable public interface MyRequest { @Nullable String getA(); @NotNull String getB(); ... } 现在我需要在请求中添加一个新字段: @JsonDeserialize(builder = ImmutableMyRequ

我在请求/响应类中使用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
发布我的请求


有什么帮助吗?

您看到了这个错误,因为旧版本没有忽略未知属性。旧服务器需要将
@JsonIgnoreProperties(ignoreUnknown=true)
作为接口的注释,以便忽略在后续版本中添加的属性


如果无法更改旧版本,则无法解决此问题,因为旧服务器设计为不忽略未知属性。

您看到此错误是因为旧版本未忽略未知属性。旧服务器需要将
@JsonIgnoreProperties(ignoreUnknown=true)
作为接口的注释,以便忽略在后续版本中添加的属性


如果您无法更改旧版本,则无法解决此问题,因为旧服务器设计为不忽略未知属性。

您是否尝试过@JsonIgnore?现有客户端不会发送新字段,但它标记为@NotNull,因此被视为错误请求(假设启用了验证)。@AndrewS抱歉,我的错误,它是可空的,我想这是默认的。@Key\u coder我还没有试过。我将尝试并更新。@Key\u coder它不起作用:/you尝试了@JsonIgnore吗?现有客户端不会发送新字段,但它被标记为@NotNull,因此它被认为是一个错误的请求(假设启用了验证)。@AndrewS对不起,我的错误,它是可以为空的,我认为默认情况下是这样。@Key\u coder我没有尝试过。我将尝试更新。@Key\u coder它不起作用:/I悲哀地认为这就是问题所在:/I悲哀地认为这就是问题所在:/