0

我正在使用 DWR 3.0.0-rc2 和 Spring 3.1.1.RELEASE。我想知道是否可以使用 Spring 样式的“@Valid”(javax.validation.Valid)注释来验证我的@DataTransferObject 输入对象。我的具体问题是,如果这是可能的,我会像这样设置我的远程呼叫......</p>

@RemoteMethod
@Override
public String myRemoteMethod(@Valid final MyDto request)
{

如何测试输入对象(请求)是否有效,然后将一组相应的错误返回给客户端?谢谢, - 戴夫

4

1 回答 1

1

这看起来是应用一些 AOP 的好案例。一种方法是创建一个@Before切面来检查被调用的参数,以查看它们是否带有注释@Valid,如果是,则触发对该参数的验证并处理结果。

这方面的代码如下所示:

@Aspect
public class ValidatingAspect {

    Validator validator;

    public ValidatingAspect() {
        Configuration<?> configuration = Validation.byDefaultProvider().configure();
        ValidatorFactory factory = configuration.buildValidatorFactory();
        this.validator = factory.getValidator();    
    }

    @Before("execution(* com.yourpackage..*.*(..))")
    public void validateBefore(JoinPoint jp) throws Throwable {
        Object[] args = jp.getArgs();
        MethodSignature ms = (MethodSignature) jp.getSignature();
        Method m = ms.getMethod();

        Annotation[][] parameterAnnotations = m.getParameterAnnotations();

        for (int i = 0; i < parameterAnnotations.length; i++) {
            Annotation[] annotations = parameterAnnotations[i];
            for (Annotation annotation : annotations) {
                if (annotation.annotationType() == Valid.class) {
                    Set<ConstraintViolation<T>> constraintViolations =  validator.validate(jp.getArgs()[i]); 
                       ... handle validation results ...
                }
            }
        }
    } 
}
于 2014-03-17T15:27:30.653 回答