将@Valid
注释放在方法参数级别时有什么用途?
public void (@Valid Person p) { ... }
我创建了一个测试,并将此方法传递给非有效对象,但没有任何反应 我希望得到一个例外。
答案 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旨在由拦截器框架使用,例如:
- 应用程序框架之类的
- JSR-299
- Enterprise Java Beans等组件框架
- 基于方面的框架
这些框架可以调用验证API 验证参数列表或方法的返回值 什么时候调用这种方法。更确切地说,验证发生在a 方法调用。 Bean Validation API的这个扩展允许 重用核心引擎以及约束定义和 声明此类方法级别验证。
答案 1 :(得分:1)
其目的是根据定义的约束验证对象。
以递归方式对关联对象执行验证。如果 object是一个集合或一个数组,元素是经过验证的 递归。如果对象是地图,则验证值元素 递归。
这可能会有助http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/