题
JSR-303是否也用于方法参数验证?
如果是这样,网络上是否有示例?我面临的最大挑战是如何在每种方法中获得验证器。使用Spring 3,这并不意味着我必须将几乎每个班级注入 LocalValidatorFactoryBean
?
谢谢!
解决方案
这听起来像是AOP的用例(extackJ)。为注释的方法编写一个点尺 javax.validation.constraints.*
, ,将验证器注入该方面(可能使用Spring)并使用 @Before
或者 @Around
建议在执行方法之前执行验证。
读 aptivej在行动中 以供参考。
其他提示
方法级别验证将在JSR 303参考实现Hibernate验证器的即将发布的4.2版中支持。
正如上一个答案中指出的那样,这将允许通过方法参数指定约束注释(内置和自定义类型),并返回值,以指定方法调用的条件和后条件。
请注意,HV仅处理未触发此类验证的方法调用的实际验证。可以使用AOP或其他方法拦截设施(例如JDK的动态代理)进行验证调用。
JIRA问题是HV-347 [1],因此您可能需要将自己添加为Watcher。
[1] http://opensource.atlassian.com/projects/hibernate/browse/hv-347
这 Javadocs 对于JSR 303注释中的每一个都告诉以下内容:
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
看, PARAMETER
在那儿。所以,是的,是 从技术上讲 可能的。
这是一个例子:
public void method(@NotNull String parameter) {
// ...
}
但是,由于我不使用它,我不确定如何与春季集成。您可以尝试一下。
在春季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 "";
}
}
从具有主动验证的标准春季Web应用程序开始,请记住在您的春季配置中添加此BEAN声明:
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
您可以使用 jcabi apects (我是开发人员),将JSR 303与extackJ集成在一起。实际验证是由JSR 303实现之一完成的,您必须将其添加到类路径,例如Hibernate验证器或Apache BVAL。