约束验证顺序 - 泽西

时间:2015-07-07 09:19:44

标签: java hibernate jersey jax-rs bean-validation

我使用Jersey 2.19来实现REST API。

我使用内置约束和用户定义约束注释了我的资源。

@Path("myPath")
public class MyResource
{
    @NotEmpty
    @AssertBoolean
    @FormParam("my-param")
    private String m_myParam;

    @POST
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes("application/x-www-form-urlencoded")
    public Response test(String body) throws Exception
    {
       ...
    }
}

我的用户定义约束@AssertBoolean会检查参数的值是true还是false

当我提交POST请求而未提供my-param的值时,我在@AssertBoolean的验证程序中收到异常,因为参数的值为null。这意味着它在@AssertBoolean之前验证@NotEmpty

我可以强制验证订单吗?或者我必须在验证器中检查null吗?

1 个答案:

答案 0 :(得分:2)

这实际上是一个关于Bean Validation约束排序的问题,因为JAX-RS依赖于Bean Validation规范,而Jersey依赖于hibernate-validator提供的实现。

要按顺序评估约束注释,需要java.lang.reflect.Field允许以其声明顺序检索注释。实际行为似乎是not reliable

然后看一下这个stackoverflow answer:它说明目前不支持显式排序bean验证约束,并链接到允许这样做的提案。

要考虑的另一点是,当单个约束失败时,bean验证不会停止,因为它允许累积来自不同约束的错误消息。

因此,要解决您的问题,只需在AssertBoolean实现中加入一个空检查。