使用JSR-303进行方法参数验证

时间:2010-12-12 23:59:59

标签: java spring bean-validation

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

如果是这样,网上有什么例子吗?我面临的最大挑战是如何在每种方法中获得验证器。对于Spring 3,这不是说我几乎要用LocalValidatorFactoryBean注入每个类吗?

谢谢!

5 个答案:

答案 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。