【问题标题】:JSR 303. Validate method parameter and throw exceptionJSR 303. 验证方法参数并抛出异常
【发布时间】:2015-01-11 00:22:26
【问题描述】:

如何使用 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
}

我觉得它很丑。

附:作为参考实现,我使用 Hibernate-validator 4.1.0.Final

【问题讨论】:

    标签: java bean-validation hibernate-validator


    【解决方案1】:

    如果你可以升级到Hibernate Validator 4.2.0或以上,你可以使用它的method validation feature,它提供了对方法参数和返回值的验证的支持。

    验证引擎可以在调用受限方法时自动调用,使用动态代理、AOP、拦截器等方式。根据您使用的框架,您可以使用例如使用以下之一:

    请注意,从 Bean Validation 1.1(即将完成)及其参考实现 Hibernate Validator 5 开始,方法验证将成为标准化 Bean Validation API 的一部分。

    【讨论】:

    • 谢谢。所以这意味着如果对象无效,用@Valid 注释注释的参数本身不会抛出异常?我需要手动创建一个方面(AOP),@pointcut 指向方法参数中的所有@Valid 注释?当找到这样的注释时,我需要创建Validator 实例并手动验证用@Valid 注释的方法参数值?
    • 你没有 AspectJ 的例子吗?
    • 很遗憾,我没有使用 AspectJ 的示例。但一般方法应该与 GitHub 上的示例项目相同:拦截调用,验证参数,继续调用,验证返回值,如果任一验证步骤失败,则抛出 ConstraintViolationException
    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2016-05-05
    • 2011-10-30
    相关资源
    最近更新 更多