2013-02-12 81 views
1

如何使用JSR-303验证方法参数并在参数无效时抛出异常?JSR 303.验证方法参数并抛出异常

例如这样的:public void createUser(@ValidOrThrowException User user) {...}

现在,我检查每个方法参数的方法体,像

public void createUser(User user) { 
    ConstraintViolations violations = Validator.validate(user); 
    if (!violations.isEmpty()) { 
     throw new IllegalArgumentException(createExceptionMessage(violations)); 
    } 
    ...//business logic 
} 

,我认为这是丑陋的。

P.S.作为参考实现,我使用Hibernate验证程序4.1.0.Final

回答

2

如果您可以升级到Hibernate Validator 4.2.0或更高版本,那么可以使用它的method validation feature,它为验证方法参数和返回值提供支持。

使用诸如动态代理,AOP,拦截器等手段调用约束方法时,可以自动调用验证引擎。根据您使用的框架,您可以例如使用下列之一:

注意,作为Bean Validation 1.1(即将完成)和它的参考实现Hibernate验证5加入example for this,方法验证将标准化Bean验证API的一部分。

+0

谢谢。所以它意味着用@ Valid语句注释的参数本身不会抛出异常,如果对象是无效的?我需要手动创建一个方面(AOP),'@pointcut'指向方法参数中的所有'@ Valid'注解?当发现这样的注释时,我需要创建'Validator'实例并手动验证用'@ Valid'注释的方法参数值? – MyTitle 2013-02-12 11:47:51

+0

难道你没有AspectJ的例子吗? – MyTitle 2013-02-12 11:51:37

+0

我不幸没有使用AspectJ的例子。但是一般方法应该与GitHub上的示例项目相同:拦截调用,验证参数,继续调用,验证返回值,如果任一验证步骤失败,则抛出'ConstraintViolationException'。 – Gunnar 2013-02-12 14:34:02