使用服务层中的Spring进行Bean验证

时间:2012-05-10 11:15:49

标签: java spring bean-validation hibernate-validator

我正在使用Spring-3.1.0.GA开发服务(而不是Web应用程序)。我想使用hibernate-validator和Spring来验证我的服务输入。

我已启用bean验证支持:

<bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>

我已使用@NotNull,@ Size,@ Valid等注释了@Validated和方法参数的服务接口,并且工作正常。

但我必须根据验证组验证我的参数,比如客户。 如果我使用@Validated或@Validated(Group1.class)注释方法参数,则Spring不执行任何验证。

如果我使用@Valid进行注释,则会进行验证,但使用默认验证组(如预期的那样)。

我无法在接口级别注释@Validate(Group1.class),因为各种方法可以在各种组上运行。

如何使用Spring和具有组支持的hibernate-validator执行服务层验证?

3 个答案:

答案 0 :(得分:1)

我已经浏览了Spring源代码以及为什么没有选择方法参数的验证组...根据代码,它仅从接口级别的@Validated中选择验证组配置,而不是在方法级别。 / p>

但是我还没有了解它在SpringMVC环境中是如何工作的,我还没有检查过。

同样在这个过程中,我开始知道如果在子应用程序上下文中配置MethodValidationPostProcessor,它就不会被Spring接收。我的意思是如果您使用SpringMVC,只有在[servlet-name] -servlet.xml中配置MethodValidationPostProcessor时才会注册它。如果在ContextLoaderListener选择的任何子上下文配置文件中配置Spring,则不会注册MethodValidationPostProcessor。此外,我不确定它是否仅适用于MethodValidationPostProcessor或任何BeanPostProcessors。

答案 1 :(得分:0)

在Spring 3.1.0+中,您可以直接在@Valid注释中使用组。例如:

@Valid(groups={Default.class, Group1.class})

答案 2 :(得分:0)

我得到以下代码,我需要在方法标题处附加@Validated并在方法参数中附加@Valid。

@Validated(Default.class)
public UserDto updateUser(@Valid UserDto userDto) {