使用注释验证构造函数参数或方法参数,并让它们自动抛出异常

时间:2010-06-12 10:20:19

标签: java exception annotations

我正在验证构造函数和方法参数,因为我想要软件,特别是它的模型部分,要快速失败。

因此,构造函数代码通常看起来像这样

public MyModelClass(String arg1, String arg2, OtherModelClass otherModelInstance) {
    if(arg1 == null) {
        throw new IllegalArgumentsException("arg1 must not be null");
    }
    // further validation of constraints...
    // actual constructor code...
}

使用注释驱动方法有没有办法做到这一点?类似的东西:

public MyModelClass(@NotNull(raise=IllegalArgumentException.class, message="arg1 must not be null") String arg1, @NotNull(raise=IllegalArgumentException.class) String arg2, OtherModelClass otherModelInstance) {

    // actual constructor code...
}

在我看来,这会使实际代码更具可读性。

了解有注释以支持IDE验证(如现有的@NotNull注释)。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:6)

在public方法中使用asserts来检查参数不是一个好主意。在编译过程中,可以从代码中消除所有断言,因此不会在运行时执行任何检查。这里更好的解决方案是使用验证框架,如Apache Commons。在这种情况下,您的代码可能是:

public MyModelClass(String arg1, String arg2, OtherModelClass otherModelInstance) {
    org.apache.commons.lang3.Validate.notNull(arg1, "arg1 must not be null");
    // further validation of constraints...
    // actual constructor code...
}

答案 1 :(得分:1)

这样的框架确实存在(JSR-330),但首先,我认为注释方法更具可读性。这样的事情对我来说似乎更好:

public MyModelClass(String arg1, String arg2, OtherModelClass otherModelInstance) {
    Assert.notNull(arg1, "arg1 must not be null");
    // further validation of constraints...
    // actual constructor code...
}

其中Assert.notNull在某处是静态方法(并且像Spring或Commons Lang中提供的那样)。

但假设您确信使用注释,请查看Hibernate Validator,这是JSR-330 API的参考实现。这有注释,就像你描述的那样。

这里的问题是您需要框架来解释这些注释。如果没有一些类加载魔法,只需调用new MyModelClass()就不会这样做。

Spring之类的人可以使用JSR-330注释来验证模型中的数据,因此您可以have a look at that,但这可能不适合您的情况。但是,类似的东西是必要的,否则注释只不过是装饰。