Hibernate Validator。如何使用@Valid注释?

时间:2013-01-25 13:55:53

标签: java hibernate-validator

@Valid注释放在方法参数级别时有什么用途?

public void (@Valid Person p) { ... }

我创建了一个测试,并将此方法传递给非有效对象,但没有任何反应 我希望得到一个例外。

2 个答案:

答案 0 :(得分:16)

对象上的@ Valid注释表示验证框架处理带注释的对象。当在方法的参数上使用时,这称为 方法级别验证 。请注意,方法级别验证是 核心规范的一部分,实际上只有在将Bean Validation集成到容器类型框架(JSF,CDI,Java EE)时才支持)。当Bean Validation集成到这样的支持容器中时,会发生的情况是,当bean调用生命周期方法时,容器会检测方法参数上的JSR 303注释并触发关联bean的验证。

例如,如果您在JAX-RS资源类中具有以下方法定义:

@Path("/example")
public class MyExampleResourceImpl {

    @POST
    @Path("/")
    public Response postExample(@Valid final Example example) {
        // ....
    }
}

当响应JAX-RS容器处理的请求调用postExample方法时,将验证example bean。将此行为与运行独立Java SE应用程序时会发生的情况进行对比:

public class MyMainClass {
    public static void main(final String[] args) {
        final MyMainClass clazz = new MyMainClass();
        clazz.echo(new Example());
    }

    public Example echo(@Valid final Example example) {
        // ...
    }
}

在这种情况下,即使您包含了所有JSR 303运行时JAR,运行该程序 也会触发Example参数的验证。这是因为没有可用的容器实现方法级别验证。 Bean Validation Specification在附录C中详细描述了所有这些内容。为了您的利益,我引用了以下部分内容:

  

方法级验证提案

     

该提议尚未纳入核心规范   而不是它的一部分。它仍然留在考古目的和   将会认真考虑将来对此进行修订   规格。这个提议可能有点不同步   其余的规范工件。

     

注意: Bean验证提供程序可以自由地实施此提议   特定的扩展。例如,可以访问这种特定扩展   通过使用Validator.unwrap方法。

     

一种流行的需求是提供方法和参数级别验证   机制重用规范的约束描述。这个   一组API旨在由拦截器框架使用,例如:

     
      
  • 应用程序框架之类的   
        
    • JS​​R-299
    •   
  •   
  • Enterprise Java Beans等组件框架
  •   
  • 基于方面的框架
  •   
     

这些框架可以调用验证API   验证参数列表或方法的返回值   什么时候调用这种方法。更确切地说,验证发生在a   方法调用。 Bean Validation API的这个扩展允许   重用核心引擎以及约束定义和   声明此类方法级别验证。

答案 1 :(得分:1)

其目的是根据定义的约束验证对象。

来自Hibernate Docs

  

以递归方式对关联对象执行验证。如果   object是一个集合或一个数组,元素是经过验证的   递归。如果对象是地图,则验证值元素   递归。

这可能会有助http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/