关于嵌套对象属性的@NotBlank无效问题的解决思路
我们在平常开发写接口时对于一些必填的请求参数除了前端那边加上校验外,在后端往往也是需要加上校验的,但不知道你们有没有遇到过在嵌套对象中加入对于某个字段加上了@NotBlank找个注解,但是这个注解只对于null做了校验,对于""(空值)的情况却失效了。举个栗子,比如我想对下图中这个对象中的字段进行校验,具体的图如下所示:
从以上代码来看,大家可以很清晰的知道我想对IndexInfoModel对象中的useType这个字段做校验,但实际的效果就如我刚开始说得那样,这个注解只对于useType为null时做了校验,对于useType为""(空值)的情况却失效了。那么怎么解决呢?经过google,发现还真有一个不错的解决方法,而且非常简单!直接在IndexInfoModel对象上加上 @Valid这个注解就可以了,如下图所示:
那么问题来了,为什么加上这个注解就可以了?难道这个注解这么神奇?我们可以看下@Valid的内部构造,具体代码我已经贴出来,如下所示:
/**
* Marks a property, method parameter or method return type for validation cascading.
* <p>
* Constraints defined on the object and its properties are be validated when the
* property, method parameter or method return type is validated.
* <p>
* This behavior is applied recursively.
*
* @author Emmanuel Bernard
* @author Hardy Ferentschik
*/
@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
public @interface Valid {
}
从注解的解释中可以清晰地知道它可以标记在属性、方法参数或方法返回类型上进行级联验证,而且第二行中已经很清楚地表达Constraints defined on the object and its properties are be validated when the property, method parameter or method return type is validated.,意思就是在验证属性,方法参数或方法返回类型时,将验证在对象及其属性上定义的约束,最后一行的This behavior is applied recursively.表明此行为是递归应用的,也就是说在IndexInfoModel对象上加上@Valid这个注解后,无论IndexInfoModel对象中嵌套多少层对象,都可以进行验证!
我觉得有个博客写得还不错,而且写得比较完整,大家可以参考下:
@Validated注解无效,以及嵌套对象属性的@NotBlank无效问题
以上就是我的对这个问题的综合阐述,如果大家还有什么疑问或者有不同的看法,欢迎大家踊跃提出!谢谢!