JSR-303是否也用于方法参数验证?
如果是这样,网上有什么例子吗?我面临的最大挑战是如何在每种方法中获得验证器。对于Spring 3,这不是说我几乎要用LocalValidatorFactoryBean
注入每个类吗?
谢谢!
答案 0 :(得分:9)
JSR 303的参考实现Hibernate Validator的即将发布的版本4.2将支持方法级验证。
正如前面的答案中所指出的,这将允许在方法参数中指定约束注释(内置以及自定义定义的类型),并返回值以指定方法调用的前置条件和后置条件。
请注意,HV只会处理方法调用的实际验证,而不会触发此类验证。验证调用可以使用AOP或其他方法拦截工具完成,例如JDK的动态代理。
JIRA问题是HV-347 [1],因此您可能希望将自己添加为此问题的观察者。
[1] http://opensource.atlassian.com/projects/hibernate/browse/HV-347
答案 1 :(得分:3)
每个JSR 303注释的javadocs告诉以下内容:
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
请参阅PARAMETER
。所以,是的,它在技术上是可能的。
以下是一个例子:
public void method(@NotNull String parameter) {
// ...
}
我不知道如何与Spring集成,因为我不使用它。你可以尝试一下。
答案 2 :(得分:3)
这听起来像是AOP(AspectJ)的用例。为使用javax.validation.constraints.*
注释的方法写一个切入点,将一个验证器注入方面(可能使用Spring)并使用@Before
或@Around
建议在方法执行之前执行验证。 / p>
阅读AspectJ in Action以供参考。
答案 3 :(得分:3)
在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"/>
答案 4 :(得分:0)
您可以使用jcabi-aspects(我是开发人员),它将JSR 303与AspectJ集成在一起。实际验证由JSR 303实现之一完成,您必须将其添加到类路径,如Hibernate Validator或Apache BVal。