使用Hibernate(JSR 303)方法验证来比较参数

时间:2012-07-16 00:11:06

标签: java hibernate aspectj bean-validation hibernate-validator

我正在使用JSR303方法验证器,可以自动地验证我的服务层的输入,并提供一些方面的帮助。肯定缺少的一件事是能够进行交叉参数验证,即例如比较两个日期参数。如何通过hibernate方法验证实现这一目标?可能吗 ?还有其他推荐的解决方法吗?

这是我方面的当前代码

public abstract aspect ValidationAspect {
@Inject
private Validator validator;

protected ParameterValidationError[] validateParameters(
        JoinPoint jp) {         
    MethodSignature methodSignature = (MethodSignature)jp.getSignature();
    Method targetMethod = methodSignature.getMethod();
    Object targetObj = jp.getThis();
    Object[] args = jp.getArgs();
    String[] names = ((CodeSignature)jp.getSignature()).getParameterNames();        

    MethodValidator methodValidador = validator.unwrap(MethodValidator.class);
    Set<? extends MethodConstraintViolation<?>> validationErrors = methodValidador.validateAllParameters(                       
            targetObj,
            targetMethod,
            args);

    ParameterValidationError[] output = new ParameterValidationError[validationErrors.size()];
    int idx = 0;
    for (MethodConstraintViolation<?> mcv : validationErrors ) {
        output[idx++] = new ParameterValidationError(
                mcv.getParameterIndex(),
                names[mcv.getParameterIndex()],
                mcv.getInvalidValue(),
                mcv.getMessage());          
    }   

    return output;
}   

}

1 个答案:

答案 0 :(得分:2)

Hibernate Validator的方法级别验证不允许交叉参数验证。它实现了Bean Validation 1.0附录C中指定的方法验证。

Bean Validation 1.1正在进行的讨论的一部分是是否以及如何支持此功能。另见