10

我一直在四处寻找一段时间,但没有运气。我没有使用 Spring MVC,但仍想使用@javax.validation.Valid来启用方法参数的验证。举个例子

public class EventServiceImpl implements IEventService {
    @Override
    public void invite(@Valid Event event, @Valid User user) { ... }
}

使用 MVC,可以@Controller通过简单的方式为带注释的 bean启用此功能<mvc:annotation-driven/>(请参阅5.7.4.3 配置 JSR-303 验证器以供 Spring MVC 使用)。

使用 AOP 应该很简单。不过,我怀疑有一些标准的方法可以做到这一点。因此,问题是:非 MVC 应用程序和非控制器 bean 是否有类似的事情来启用带注释的 bean 的输入验证?

4

3 回答 3

7

方法级验证不是 Bean 验证规范 (JSR 303) 的一部分。方法级别验证是附录 C中添加的规范中的一项建议。

Hibernate Validator 4.2(已经发布了一个测试版)正在实现这个建议,并允许在方法参数和返回值上放置 JSR 303 注释。当然,您仍然需要一些 Spring 胶水代码,但这应该不会太难。

此外,Bean Validation 1.1 将在规范中正式添加方法级别的验证(不仅仅是作为附录/建议)。另请参阅http://beanvalidation.org/

于 2011-02-05T14:29:34.663 回答
4

使用 MVC,这是为 @Controller 注释的 bean 启用的

@Valid 只是 Controller bean 中的一个标记,它隐藏了执行验证的代码并Errors以一种很好的方式放入所有违反约束的代码。Spring 设计师本可以发明他们自己的注解来做同样的事情。

@Valid 注解的真正用途是在您使用 JSR 303 验证器验证的类(bean)中,它的主要用途是验证对象图。这意味着一个 bean 可以有其他带有 @Valid 注释的 bean 引用以递归地触发验证。

在 MVC 之外,您可以使用已配置的验证器来验证任何使用 JSR 303 注释的 bean,但是,与Errors控制器中很好地填充的不同,您必须自己决定要如何处理违反约束。

因此,要回答您的问题,没有标准的方法。要具有与控制器相同的外观,您可以使用@Valid 注解(或创建一个新注解)来运行 AOP 建议以验证 bean 并填充必须传递给方法。

于 2011-02-05T00:32:56.833 回答
1

答案似乎很老了。到目前为止,您可以使用@ValidatedMethodValidationPostProcessor对任何 Spring bean 进行方法内联验证。它们基本上负责为任何层的 Spring 托管 bean 创建类似切入点的行为,而不是专门为控制器创建的。另请参阅我的其他答案

于 2019-02-11T12:01:34.493 回答