java自定义校验器
以前在公司写接口的时候,参数都是用Map接收,因为不用定义实体类,这样可以节省很多后台工作量,接口字段跟前端约定好,由前端传输,但是也带来了很多问题,因为之前大家没有写接口文档的习惯,所以几百个接口都没有留存接口文档,每次找接口都得屡代码。
并且,最主要的是,以前因为要快速上线迭代,怎么快速怎么来,很多接口字段的校验,由前端来做,后端不需要重复校验,现在比较稳定下来了,领导们要求测试对接口的测试,精确到字段是否为空,格式,都要精准匹配。稍微有点不一样,就要提bug。为了方便接口字段校验,现在用实体类做接收。
前几天遇到一个问题,现在想想也不算是问题。
要保存用户上传的省市区信息,前端是展示文字,上传后端时是传输代码,省市区在一个字段里,用逗号分割,比如,居住地省市区编码liveAddressCode:"12345,2345,3345",并且后台要拆分独立上送下游系统。spring自带的校验器无法满足使用需求,需要自定义注解和校验器。
最开始是这样设计的实体类(因为是沿用以前的老逻辑,所以并没有把居住地省市区编码单独拆开,为了方便前端快速开发,而且,@JSONField字段表明了,以前也不知道是怎么设计的字段,完全不符合明明规范啊。。)



。但是这样,测试妹子调接口,如果传了非空的,但是不符合格式的字段,实例化的时候就会报错了。并不能返回具体明确的提示,被提了一个bug。
然后我加了自定义注解



但是这样,仍然会报错(liveAddressCode传不带逗号的字符串),实例化的时候,总是会报out of bounds exception。试过很多方法,什么lazy注解,妄图在实例化的时候,先不实例化该字段,等校验通过,后面使用的时候,再实例化。然并卵。 .后来突然想到了,我tm的为什么要加字段啊?我只加get方法就可以了啊卧槽!害得我搞到半夜!!!

于是我删除了单独的省,市,区字段。

然后又增加了一个配置类,只要一个校验不通过就返回(忘了从哪个博主那里看到的了,十分感谢)。可以省不少性能啊,哇哈哈

故事到这里基本就结束了。
还有之前研究过的一个校验,也是从别的技术博主那里看到的,希望看到的能指出。
因为有很多字段,其实并不是前端传过来的时候,就想要去校验,是根据代码或者业务逻辑的不同,而自主校验,就没办法使用这种方式了。
so,我也是添加了自定义注解。




以上全部校验,都是在controller层统一捕捉
可以定义一个类,使用@RestControllerAdvice与@ControllerAdvice注解,进行全局异常捕捉,具体的也可以百度。
或者像我们项目一样,定义baseController,其他全部controller都继承该baseController,但该baseController并未被spring管理。

好了,本次记录就到这里结束了。肯定不是十分完美,看到的各位大佬们,多沟通。
网友评论