JSR-303 是否也用于方法参数验证?
如果是这样,网络上是否有任何示例?我面临的最大挑战是如何在每种方法中获取验证器。使用 Spring 3,这是否意味着我几乎必须在每个类中注入LocalValidatorFactoryBean
?
谢谢!
JSR-303 是否也用于方法参数验证?
如果是这样,网络上是否有任何示例?我面临的最大挑战是如何在每种方法中获取验证器。使用 Spring 3,这是否意味着我几乎必须在每个类中注入LocalValidatorFactoryBean
?
谢谢!
即将发布的 JSR 303 的参考实现 Hibernate Validator 4.2 版将支持方法级别的验证。
正如在上一个答案中所指出的,这将允许在方法参数中指定约束注释(内置以及自定义类型)并返回值来指定方法调用的前置和后置条件。
请注意,HV 将仅处理方法调用的实际验证,而不是触发此类验证。验证调用可以使用 AOP 或其他方法拦截工具(如 JDK 的动态代理)来完成。
与此相关的 JIRA 问题是 HV-347 [1],因此您可能希望将自己添加为该问题的观察者。
[1] http://opensource.atlassian.com/projects/hibernate/browse/HV-347
每个 JSR 303 注释的javadocs说明如下:
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
看,PARAMETER
有没有。所以,是的,这在技术上是可行的。
这是一个例子:
public void method(@NotNull String parameter) {
// ...
}
但是我不确定它是如何与 Spring 集成的,因为我不使用它。你可以试一试。
在 Spring 3.1.0 中,您可以使用 @Validated 注解来激活 pojo 上的验证。为 pojo 类创建一个接口并在其上放置此注释,然后在方法定义中添加您的验证注释。(接口是必需的,因为 Spring 将使用接口作为定义创建一个代理类)
@Validated
public interface PojoClass {
public @NotNull String doSomething(@NotEmpty String input);
}
你的pojo:
public class PojoClassImpl implements PojoClass {
public String doSomething(String input) {
return "";
}
}
从具有主动验证的标准 Spring Web 应用程序开始,请记住在您的 Spring 配置中添加此 bean 声明:
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
这听起来像是 AOP (AspectJ) 的用例。为使用 注释的方法编写切入点javax.validation.constraints.*
,将验证器注入方面(可能使用 Spring)并使用@Before
or@Around
建议在方法执行之前执行验证。
阅读AspectJ in Action以供参考。
您可以使用jcabi-aspects(我是一名开发人员),它将 JSR 303 与 AspectJ 集成在一起。实际验证由 JSR 303 实现之一完成,您必须将其添加到类路径中,例如 Hibernate Validator 或 Apache BVal。