9

@Valid将注释放在方法参数级别时,注释的目的是什么?

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

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

4

2 回答 2

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) {
        // ....
    }
}

postExample响应由 JAX-RS 容器处理的请求而调用该方法时,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 Validation 提供者可以自由地将这个提议作为一个特定的扩展来实现。例如,可以通过使用 Validator.unwrap 方法访问此类特定扩展。

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

  • 应用程序框架,如
    • JSR-299
  • Enterprise Java Beans 等组件框架
  • 基于方面的框架

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

于 2013-01-25T14:33:25.833 回答
1

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

休眠文档

对关联对象递归执行验证。如果对象是集合或数组,则递归验证元素。如果对象是映射,则递归验证值元素。

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

于 2013-01-25T14:00:32.547 回答