约束验证顺序 - 泽西岛

Order of constraint validation - Jersey

我正在使用 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 .这意味着它在 @NotEmpty.

之前验证 @AssertBoolean

我可以在验证时强制下单吗?还是我必须在我的验证器中检查 null

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

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

然后看看这个 Whosebug answer:它指出现在不支持对 bean 验证约束的显式排序,并链接到允许这样做的提案。

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

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