求分享, Java 有没有什么数据校验的好办法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BuilderQiu
V2EX    问与答

求分享, Java 有没有什么数据校验的好办法?

  •  
  •   BuilderQiu 2016-03-18 16:05:40 +08:00 5837 次点击
    这是一个创建于 3570 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家有没有什么 Java 数据校验的好方法?除了jsr-303那一套的。求分享~

    BTW :

    • 大家都是在什么地方做数据校验的?ControllerService
    • 用检验框架(比如?)还是全手写?感觉 N 多字段,手写简直崩溃。
    • Hibernate-validator这种实现,在字段上增加注解来进行校验,如果同一个对象,不同的校验场景如何处理?
    24 条回复    2017-07-26 09:32:44 +08:00
    3dwelcome
        1
    3dwelcome  
       2016-03-18 16:38:38 +08:00
    如果只是防止第三方非法修改数据内容,个人觉得数据发送前做个全局数据流 hash, 然后签名就可以了。

    签名不能伪造 => hash 值无法被第三方修改 => 数据流安全。
    BuilderQiu
        2
    BuilderQiu  
    OP
       2016-03-18 16:43:43 +08:00
    @3dwelcome
    不是防篡改这种场景哈 ,就基本的数据校验,字段非空,电话号码格式这种

    防篡改加 Hash 这种也只适合服务器之间约定好的通讯吧,客户端 Hash 也没用吧
    88250
        3
    88250  
       2016-03-18 16:51:39 +08:00
    Controller 参数格式校验一直手写, Service 里面做参数相关业务逻辑的校验
    BuilderQiu
        4
    BuilderQiu  
    OP
       2016-03-18 17:32:04 +08:00
    @88250
    现在也基本都是手写的,不过感觉太繁琐了,场景一多,判断写一堆
    Sharuru
        5
    Sharuru  
       2016-03-18 17:34:03 +08:00
    =m= 看具体环境吧,比如我现在写的这个,全靠前端 validation 来检测,后台抓个大异常,然后防一下 SQL 注入。
    88250
        6
    88250  
       2016-03-18 17:36:24 +08:00
    @BuilderQiu 手写比较好控制,其实代码也不会太多的,而且调试方便
    fwrq41251
        7
    fwrq41251  
       2016-03-18 17:37:42 +08:00
    spring mvc @Validated
    可以指定 group 。
    slixurd
        8
    slixurd  
       2016-03-18 17:39:10 +08:00
    如果传个 Bean 进来,或者传过来的数据可以反序列化为 VO ,我们都把校验逻辑会写在 VO 里
    这样可以简单复用一下,比较一个 VO 用在多个地方很正常
    BuilderQiu
        9
    BuilderQiu  
    OP
       2016-03-18 17:40:20 +08:00
    @Sharuru
    后端也得检验哇
    BuilderQiu
        10
    BuilderQiu  
    OP
       2016-03-18 17:40:51 +08:00
    @88250
    主要是代码都差不多,判空之类的
    BuilderQiu
        11
    BuilderQiu  
    OP
       2016-03-18 17:41:30 +08:00
    @fwrq41251
    分组到是可以~不同场景用不同组
    BuilderQiu
        12
    BuilderQiu  
    OP
       2016-03-18 17:45:17 +08:00
    @slixurd

    不同的校验场景没法弄吧这样,而且现在的 Bean 基本都是贫血的吧
    Ouyangan
        13
    Ouyangan  
       2016-03-18 17:48:14 +08:00
    这个问题我也很困惑 , 关注
    88250
        14
    88250  
       2016-03-18 18:01:45 +08:00
    @BuilderQiu 工具类调用,封装一下返回文案范围值啥的,也就 1 行代码..
    murmur
        15
    murmur  
       2016-03-18 18:44:26 +08:00
    前端无论怎么做后端都要校验 但是有些东西必须失败一次才知道结果 比如唯一性校验 或者涉及外键关联的 那就了 是让 try 一下让他报错接着 还是真的去数据库校验一次呢
    BuilderQiu
        16
    BuilderQiu  
    OP
       2016-03-18 18:53:33 +08:00
    @murmur
    这种一般都是去查一次吧?虽然还是可能查询的时候不存在,添加的时候已存在了最后进入报错流程……
    caixiexin
        17
    caixiexin  
       2016-03-18 20:21:13 +08:00 via Android   1
    参数完整性,判空,长度,字符串个数的校验,用 jsr303 够用了呀。
    写一个 baseController ,在里面同一捕获 jsr303 的异常,并封装 response 。然后所有 controller 基础它。
    剩下的工作就是定义各种错误的 message 和新增接口的时候为每个请求类里面属性加注解了。
    另外, Hibernate-validato 不就是 jsr303 的实现吗
    caixiexin
        18
    caixiexin  
       2016-03-18 20:22:09 +08:00 via Android
    @caixiexin 字符串个数 ->字符串格式
    BuilderQiu
        19
    BuilderQiu  
    OP
       2016-03-18 21:19:33 +08:00
    @caixiexin
    我就是说 Hibernate-Validator 那种实现
    想了解看看还有木有其他办法
    odirus
        20
    odirus  
       2016-03-18 21:38:54 +08:00
    @caixiexin 谢谢,我也有这个问题。。。一直不是非常明白。

    请教一下: hibernate validator 是挺好用的,但是万一我传入的参数不是一个 bean 里面的字段呢?谢谢。主要是写接口的时候,参数和 bean 没任何联系。
    BuilderQiu
        21
    BuilderQiu  
    OP
       2016-03-18 22:03:56 +08:00   1
    @odirus

    多个参数的话,一种是封装成一个对象吧,另外就只有手动写了?不知道还有其他办法没
    odirus
        22
    odirus  
       2016-03-18 22:18:33 +08:00
    @BuilderQiu 谢谢。
    Coande
        23
    Coande  
       2017-07-26 01:16:09 +08:00
    楼主有没有找到比较好的方法?一直比较疑惑。
    BuilderQiu
        24
    BuilderQiu  
    OP
       2017-07-26 09:32:44 +08:00   1
    @Coande
    目前还是用的 jsr-303 那一坨,复杂的验证就自定义
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3502 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 10:23 PVG 18:23 LAX 02:23 JFK 05:23
    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