Spring @Validated in service layer
我想@Validated(group=Foo.class)
在执行如下方法之前使用注释来验证参数:
public void doFoo(Foo @Validated(groups=Foo.class) foo){}
当我将此方法放在Spring应用程序的Controller中@Validated
时,当Foo对象无效时,将执行并引发错误。但是,如果我在应用程序的Service层中的方法中放入相同的内容,则即使Foo对象无效,也不会执行验证并且该方法仅会运行。
你不能@Validated
在服务层中使用注释吗?还是我必须做一些额外的配置才能使其正常工作?
更新:
我已经将以下两个bean添加到service.xml中:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/><bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
并取代了@Validate
用@Null
像这样:
public void doFoo(Foo @Null(groups=Foo.class) foo){}
我知道这是一个很愚蠢的注释,但是我想检查一下,如果我现在调用该方法并传递null,它将引发违规异常。那么,为什么执行@Null
注释而不是@Validate
注释呢?我知道一个javax.validation
来自Spring,另一个来自Spring,但是我不认为这与它有任何关系吗?
回答:
在Spring MVC堆栈的眼中,没有诸如服务层之类的东西。它适用于@Controller
类处理程序方法的原因是,Spring使用了一个特殊的HandlerMethodArgumentResolver
调用ModelAttributeMethodProcessor
,该调用在解析要在处理程序方法中使用的参数之前执行验证。
我们称之为服务层,只是一个普通的bean,没有从MVC(DispatcherServlet
)堆栈中添加任何其他行为。因此,你不能期望Spring进行任何验证。你可能需要使用AOP自己滚动。
用MethodValidationPostProcessor
,看看javadoc
适用的方法在其参数和/或它们的返回值上具有JSR-303约束注释(在后一种情况下在方法级别指定,通常作为内联注释)。
可以通过Spring的Validated注释在包含的目标类的类型级别上指定验证组,并将其应用于该类的所有公共服务方法。默认情况下,JSR-303将仅针对其默认组进行验证。
该@Validated注释仅用于指定验证组,它本身并不强迫任何验证。你需要使用一种javax.validation
注释,例如@Null
或@Valid
。请记住,你可以在方法参数上使用任意数量的注释。
以上是 Spring @Validated in service layer 的全部内容, 来源链接: utcz.com/qa/420538.html