【问题标题】:Order of constraint validation - Jersey约束验证顺序 - 泽西岛
【发布时间】:2015-07-07 09:19:44
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2015-11-25
      • 2017-05-13
      相关资源
      最近更新 更多