10

JSR-303 是否也用于方法参数验证?

如果是这样,网络上是否有任何示例?我面临的最大挑战是如何在每种方法中获取验证器。使用 Spring 3,这是否意味着我几乎必须在每个类中注入LocalValidatorFactoryBean?

谢谢!

4

5 回答 5

10

即将发布的 JSR 303 的参考实现 Hibernate Validator 4.2 版将支持方法级别的验证。

正如在上一个答案中所指出的,这将允许在方法参数中指定约束注释(内置以及自定义类型)并返回值来指定方法调用的前置和后置条件。

请注意,HV 将仅处理方法调用的实际验证,而不是触发此类验证。验证调用可以使用 AOP 或其他方法拦截工具(如 JDK 的动态代理)来完成。

与此相关的 JIRA 问题是 HV-347 [1],因此您可能希望将自己添加为该问题的观察者。

[1] http://opensource.atlassian.com/projects/hibernate/browse/HV-347

于 2011-01-09T23:43:26.853 回答
3

每个 JSR 303 注释的javadocs说明如下:

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})

看,PARAMETER有没有。所以,是的,这在技术上是可行的。

这是一个例子:

public void method(@NotNull String parameter) {
    // ...
}

但是我不确定它是如何与 Spring 集成的,因为我不使用它。你可以试一试。

于 2010-12-13T00:10:43.997 回答
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"/>
于 2013-05-16T15:37:28.490 回答
2

这听起来像是 AOP (AspectJ) 的用例。为使用 注释的方法编写切入点javax.validation.constraints.*,将验证器注入方面(可能使用 Spring)并使用@Beforeor@Around建议在方法执行之前执行验证。

阅读AspectJ in Action以供参考。

于 2010-12-13T07:33:10.783 回答
0

您可以使用jcabi-aspects(我是一名开发人员),它将 JSR 303 与 AspectJ 集成在一起。实际验证由 JSR 303 实现之一完成,您必须将其添加到类路径中,例如 Hibernate Validator 或 Apache BVal。

于 2013-03-15T11:09:37.330 回答