关于 spring boot 的参数校验的问题,如何不用注解以及具体对象来校验 Map 里的属性 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
19 条回复    2021-06-11 15:53:50 +08:00
xuanbg
    1
xuanbg  
   2021-06-10 19:11:49 +08:00
我还想用 Object 也收获同样的功能呢。。。
0576coder
    2
0576coder  
OP
   2021-06-10 19:20:09 +08:00
@xuanbg
老哥 我是认真的- -
我是真的想校验 map 的属性,如果没有优雅实现的话只能就按我上面手动实现
dethan
    3
dethan  
   2021-06-10 19:51:55 +08:00 via Android
结构不确定的 map,结构不确定你怎么写规则
fkdog
    4
fkdog  
   2021-06-10 19:52:30 +08:00
我自己的经验是,验证这种东西都尽量在 controller 层自己去手动判断,而不是借助于框架的 validation 。

因为框架验证需要传入借助很多注释 api,过于侵入 pojo 。有时候不止 api 层需要做 validation,orm 层也需要 validation,有时候一个 pojo 里有多种 validation 会很奇怪。而且许多的项目,虽然你在 controller 层禁止某个字段 NULL,但是实际上在数据库里存的是允许为 NULL,这样其他人看着就很困惑。

另外有时候多版本兼容、需求变更,可能某个接口里某个字段是允许为空的。这样的情况比比。

所以还是手动写比较好。
0576coder
    5
0576coder  
OP
   2021-06-10 20:02:39 +08:00
@dethan
就是这个 map 可能有十几种情况 我如果不想写十几个具体的类
我想传入一个 rule map 来动态的校验
    6
dushixiang  
   2021-06-10 20:11:24 +08:00
如果是 json 格式的话可以用 json schema 校验。
securityCoding
    7
securityCoding  
   2021-06-10 20:25:49 +08:00
设计一个小的核心组件,抽象一个 filter 接口 ,把所有情况用 filter 实现一遍
echo1937
    8
echo1937  
   2021-06-10 21:18:10 +08:00
@fkdog #4 你这是把 DO/DTO/BO/VO 这些全部用一个 pojo 来处理,那么自然会出现多种 validation 啊
aragakiyuii
    9
aragakiyuii  
   2021-06-10 21:28:26 +08:00 via iPhone
map 维护起来真的是…还是写个类维护吧…validator 可以做分组校验
fkdog
    10
fkdog  
   2021-06-10 23:04:12 +08:00
@echo1937
说是这么说,但是实际开发里很多场景这些 object 都可以一个搞定。
feitxue
    11
feitxue  
   2021-06-11 00:11:18 +08:00
之前用百度的 FluentValidator 做复杂的校验...
不过感觉对你来说还说这个框架还是太重了
https://github.com/neoremind/fluent-validator
lostSoul
    12
lostSoul  
   2021-06-11 09:33:52 +08:00
那你这不适合在控制层做校验了 正如楼上说的 filter 和 json 校验 可以单独写一个 filter 拿到 json 对他进行规则校验 单纯的拿 map 一个一个 get 或者 entrySet 都不是很雅
iseki
    13
iseki  
   2021-06-11 10:00:47 +08:00
纯手写是最糟糕的做法,逻辑全部耦合死。不知道你输入是什么样子的,如果是 json,Jackson 之类的多态反序列化是可以处理的
0576coder
    14
0576coder  
OP
   2021-06-11 10:27:20 +08:00
@lostSoul
感谢老哥 我知道我这个不适合再控制层校验,主要我那边有特殊场景就是要这样用 map,我试试你推荐的
0576coder
    15
0576coder  
OP
   2021-06-11 10:30:01 +08:00
@echo1937
其实我写了差不多一年的 java 我感觉各种 O 是不是太多了,纯粹是为了面向对象而面向对象。还是说 java 都是这样的,我感觉是不是大家都受福报厂影响太深,他们的傻逼规范都变成了行业标杆
Gary43
    16
Gary43  
   2021-06-11 10:49:37 +08:00
echo1937
    17
echo1937  
   2021-06-11 10:59:16 +08:00
@0576coder #15 你的 O 指的是返回给上层的实体类吧?当然可以不用啊,用 Map 来封装。需要自己详细记好 map 中 key-value 映射的关系,尤其的记好自己给每个数据库字段所定义的 key 值以做中间过程的查看或修改。其次,当你的代码不止你一个维护时,你的同事并不能通过查看实体类来获知你这个业务所传递的具体字段,只有通过询问或查看 Map 文件或者调试才能知晓,也不利于自己后期的 codeReview 。而且 Java 这种静态类型的语言,你取 value 的时候还需要从 object 强转。

工程问题从来都是取舍 tradeoff 。
neptuno
    18
neptuno  
   2021-06-11 14:52:30 +08:00
考虑尽量不用 map ?参数还是用指定的一个类去接收吧
0576coder
    19
0576coder  
OP
   2021-06-11 15:53:50 +08:00
@Gary43
感谢老哥 我试试
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5423 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 32ms UTC 01:42 PVG 09:42 LAX 17:42 JFK 20:42
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86