Files
kaka111222333-kaka111222333…/_posts/2017-05-27-mvc-validator.md
2019-11-17 01:12:14 +08:00

2.2 KiB
Raw Blame History

title, tags, categories
title tags categories
记一次在spring-mvc中踩坑的经历 spring mvc java java

今天打算在项目中加入数据验证功能,具体可参考 数据验证

过程无须赘述

配置完成后,奇怪的现象发生了,BindingResult.hasErrors()永远返回false ![hasErrors][hasErrors]

这是什么情况? validator 未指定?我赶紧检查配置: ![notNull][notNull]

![driven][driven] 配置没有问题,日志能够正常打印,且没有错误,排除类加载失败的可能。

上google搜索一下 ![google][google] 翻看了第一页的回复大多来自stackoverflow无非是让你引入包, 加配置, 我项目里配置符合这些回复的要求, 所以需要另想办法

自己动手吧!我加入如下代码以验证validator是否被正确加载 ![initBinder][initBinder] validator果然为null, 且如果拿到validator对象并set进去就可以解决BindingResult.hasErrors()永远返回false的问题, 然而这种处理方式需要在每个Controller中写一遍initBinder, 这种方式并不完美。

是什么原因造成validator丢失呢? 我们知道annotation-driven会在spring中自动注册多个bean, 详情请移步自动注册 会不会是项目中存在某些配置覆盖了其中的bean造成了validator丢失? 仔细扫描一下配置文件, 发现果然如此, 项目中为了更换json转换器, 自定义了一个bean ![adapter][adapter]

到了这个地步基本上找到原因了解决方式很简单将validator绑定起来就可以了 ![validator-config][validator-config]

[hasErrors]:{{"/mvc-validator/hasErrors.jpg" | prepend: site.imgrepo }} [validator-config]:{{"/mvc-validator/validator-config.jpg" | prepend: site.imgrepo }} [google]:{{"/mvc-validator/google.jpg" | prepend: site.imgrepo }} [initBinder]:{{"/mvc-validator/initBinder.jpg" | prepend: site.imgrepo }} [adapter]:{{"/mvc-validator/adapter.jpg" | prepend: site.imgrepo }} [driven]:{{"/mvc-validator/driven.jpg" | prepend: site.imgrepo }} [notNull]:{{"/mvc-validator/notNull.jpg" | prepend: site.imgrepo }}