BeanValidation: 如果把violation和方法参数联系起来

罗格林 发布于 2017/03/07 18:31
阅读 378
收藏 0

JSR349 BeanValidation 1.1标准定义了ExeutableValidator.validateParameters方法. 该API可以验证一个方法的参数是否有效. 这个方法返回一个ConstraintViolation的集合

我现在遇到的问题是如何将集合中的ConstraintViolation元素和传递给validateParameters API的参数列表中的参数联系起来. 换句话说, 我希望知道是那个参数导致的violation.

有人遇到过这种问题吗?

加载中
0
罗格林
罗格林

这个问题答案在ConstraintViolation中的propertyPath属性里面, 这个属性的类型是javax.validation.Path, 一个Path由多个节点组成, 其中有一个节点是NodeImpl.ParamNodeImpl, 把这个节点toString()的话会返回类似arg0, arg1, arg2这样的字串. 字串中的0, 1, 2就是参数的位置变量. 拿到这个变量, 我就可以推断出用户是那个form field出错了

0
乌龟壳
乌龟壳

虽然不知道你在说啥,但是我强答一下

for (ConstraintViolation c: paramters) {
    System.out.println(c.getMessage());
}

 

0
罗格林
罗格林

引用来自“乌龟壳”的评论

虽然不知道你在说啥,但是我强答一下

for (ConstraintViolation c: paramters) {
    System.out.println(c.getMessage());
}

 

先谢谢了. 不过不是这个问题

JSR349中和这个问题相关的API: 

	/**
	 * Validates all constraints placed on the parameters of the given method.
	 *
	 * @param <T> the type hosting the method to validate
	 * @param object the object on which the method to validate is invoked
	 * @param method the method for which the parameter constraints is validated
	 * @param parameterValues the values provided by the caller for the given method's
	 *        parameters
	 * @param groups the group or list of groups targeted for validation (defaults to
	 *        {@link Default})
	 * @return a set with the constraint violations caused by this validation;
	 *         will be empty if no error occurs, but never {@code null}
	 * @throws IllegalArgumentException if {@code null} is passed for any of the parameters
	 *         or if parameters don't match with each other
	 * @throws ValidationException if a non recoverable error happens during the
	 *         validation process
	 */
	<T> Set<ConstraintViolation<T>> validateParameters(T object, Method method, Object[] parameterValues, Class<?>... groups);

现在假设我要验证的方法是:

public class MyController {

   public void handleXxxRequest(@Size(max = 5) String s1, @Digits(integer = 4, fraction = 2) n1) {
      ...
   }

}

下面是我对上面方法的一次调用的验证

validateParameters(myController, handleXxxRequestMethod, "123456",  123456.4321)

那我应该收到两个Violations, 一个是字串s1长度越界, 一个是数字n1整数部分和小数部分都越界. 我现在的问题是要把这两个violations和参数0(s1)还有参数1(n1)联系起来. 告诉用户你的s1错误了,因为..., n1也错了,因为...

返回顶部
顶部