Java 约束验证顺序-Jersey

Java 约束验证顺序-Jersey,java,hibernate,jersey,jax-rs,bean-validation,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

我正在使用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

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

要按顺序计算约束注释,需要java.lang.reflect.Field允许按声明顺序检索注释。实际行为似乎是

然后看一下这个stackoverflow:它声明现在不支持bean验证约束的显式排序,并链接到一个允许这样做的建议

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

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