如何使用bean验证进行JAX-RS部分更新

Maj*_*imi 6 java json jax-rs jersey jackson

这似乎很疯狂,但是我在处理JAX-RS部分JSON请求时遇到了麻烦。例如,假设我们有一个实体:

public class Data {
    private String a;
    private String b;
    private Integer c;
    /* this is flat and large object with many fields */
}

@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Path("/data")
public Response updateData(Data d) {
    /* update database */
}
Run Code Online (Sandbox Code Playgroud)

现在,我想让用户更新一些字段。因此,用户发送这样的请求:

{ "a": "data of field a" }
Run Code Online (Sandbox Code Playgroud)

这意味着仅更新字段“ a”。当用户要将字段“ a”设置为null时,他将发送{ "a": null }。问题是在服务器端,我无法确定客户端是否要将字段“ a”设置为null或请求中没有字段“ a”,因此我不应该触摸字段“ a”(在两种情况下,“ a”都会为空)。一种解决方案是读取Map<String, Object>而不是Data。通过这种方式,我可以区分这两种情况,但是我将松散bean验证框架,并且我应该做很多类型转换(Objectto String/Integer/List<Integer>)。是否有任何简洁的方式来处理此类部分更新请求?我在Jetty上使用Jersey 2.9和Jackson 2.3。