有关 springboot 接受参数和返回参数的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kqq19930511
V2EX    Java

有关 springboot 接受参数和返回参数的问题

  •  
  •   kqq19930511 2022-09-09 09:12:57 +08:00 3337 次点击
    这是一个创建于 1133 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如数据库有个表,对应 java 模型是:

    public class User { @Comment("用户 id") @Column(length = 36) private String id; @Comment("用户名") private String userame; @Comment("昵称") private String nickname; @Comment("登录密码") private String password; @Comment("密码过期时间") private Date passwordExireTime; @Comment("0: 新用户 1: 正常使用 2:停止使用") private Integer status; @Comment("最近登录时间") private Date loginTime; @Comment("连续登录错误次数") private Integer loginErrorCount; @Comment("创建时间") private Date createdAt; @Comment("所属组") private String userGroupId; } 

    举个例子,现在有新增、删除、更新接口,每个接口传的参数不一样并且校验参数的逻辑也不一样,现在我的处理是生成三个参数对象: InsertUserForm 、DeleteUserForm 、UpdateUserForm ,然后用不同的校验逻辑,这三个对象都会返回不同的参数,需要新建三个对象存储返回参数 InsertUserVO, DeleteUserVO, UpdateUserVO ,想问一下实际怎么处理这些情况的?

    23 条回复    2022-09-10 10:41:18 +08:00
    gwkoooo
        1
    gwkoooo  
       2022-09-09 09:33:36 +08:00
    新增和编辑可以用 @Validate 的分组校验,返回的话就分开新建,也可以请求参数抽取一个 BaseForm ,返回参数收取一个 BaseVO 继承一下
    KingOfUSA
        2
    KingOfUSA  
       2022-09-09 09:33:44 +08:00
    1. 对于你这种通过对象入参的方式暂时还没有想到更好的处理方式。我个人更喜欢普通类型的入参,然后定义一些常用的规则(比如类型、长度、是否避免等),在 controller 层对于参数加上不同的规则。

    2. 返回参数的问题,可以使用我写的这个库 https://github.com/ksprider/Surgical ,在 controller 层通过注解的方式来决定返回不同的属性,避免了 vo1 vo2 vo3...难以复用的情况
    ylls
        3
    ylls  
       2022-09-09 09:34:40 +08:00
    @Validated 配上 javax.validation.constraints 的 groups
    KingOfUSA
        4
    KingOfUSA  
       2022-09-09 09:34:47 +08:00
    @KingOfUSA 是否避免 = 是否必填
    Edsie
        6
    Edsie  
       2022-09-09 09:56:09 +08:00
    定义一个领域层面的 User ,(你上面的 User 是属于 Entity 的)
    ```
    public class Use {
    private String username;
    private String nickname;
    private String password;
    }
    ```
    create,update,delete 主题都是它,校验逻辑通过分组校验分开
    git00ll
        7
    git00ll  
       2022-09-09 10:48:06 +08:00
    我觉得建三个没问题,区分出来比较清晰。1f 那样做 会在增加复杂性。
    并且这种接口写完了一般不会改
    xiao109
        8
    xiao109  
       2022-09-09 11:20:36 +08:00
    Map 打天下
    KevinBlandy
        9
    KevinBlandy  
       2022-09-09 11:22:17 +08:00
    Validate 那 group 真不建议用,用着用着能给自己整糊涂了。不同业务接口,创建不同对象吧还是。必要的时候可以用 MapStruct 之类的工具转换。
    frank1256
        10
    frank1256  
       2022-09-09 11:48:27 +08:00
    MapStruct
    egfegdfr
        11
    egfegdfr  
       2022-09-09 13:45:53 +08:00
    entity 类,能满足的情况下,就直接用 entity ,entity 不够的话,增加 vo 类。能复用的情况下,尽量复用。如果每一个接口都严格按照你这种方式来,会照成大量的重复性的代码。不利于维护
    kqq19930511
        12
    kqq19930511  
    OP
       2022-09-09 13:57:16 +08:00
    @xiao109 可维护性太差了
    kqq19930511
        13
    kqq19930511  
    OP
       2022-09-09 13:57:41 +08:00
    @KevinBlandy 是的,现在啊就是用 mapstruct 转换的
    kqq19930511
        14
    kqq19930511  
    OP
       2022-09-09 13:58:24 +08:00
    @Edsie 需要生成 swagger 文档,这种设计不行吧
    Leviathann
        15
    Leviathann  
       2022-09-09 13:58:24 +08:00
    就分开啊
    不一样的东西不要放一起
    或者抽一个 UserCommons 之类的接口把共性提取出来
    kqq19930511
        16
    kqq19930511  
    OP
       2022-09-09 13:59:58 +08:00
    @7911364440 怎么配合 swagger 生成文档呢?
    7911364440
        17
    7911364440  
       2022-09-09 14:21:08 +08:00
    @kqq19930511 可以在字段注释上加一些特殊说明,比如新增时必填,修改时必填之类的
    Rache1
        18
    Rache1  
       2022-09-09 17:17:04 +08:00
    挤在一起就违反单一原则了
    likeme
        19
    likeme  
       2022-09-09 17:39:27 +08:00
    我也是按照你这个思路开发的。这样挺好啊,没有耦合,只不过代码冗余比较多,这点冗余没什么吧。。。起码可以让代码看的清晰明了。
    zhuweiyou
        20
    zhuweiyou  
       2022-09-09 17:40:59 +08:00
    Map 一把梭
    28Sv0ngQfIE7Yloe
        21
    28Sv0ngQfIE7Yloe  
       2022-09-10 00:45:49 +08:00
    分开降低心智负担,简单的业务倒是可以用 Groups ,等到你针对这个 Entity 的业务变多了,那些个 b 注解能看的吐血
    liangkang1436
        22
    liangkang1436  
       2022-09-10 10:38:48 +08:00 via Android
    分组校验的最大的好处是集中校验逻辑,集中错误信息,在应用的多个层面对同一个实体进行校验的时候去除重复代码,但是坏处就是当分组较多的时候,看起来会有点乱(虽然这在我看来不是缺点),跟 swagger 的适配应该也不是难事,毕竟 beanvalidation 都发展这些年了,不可能不兼容。
    liangkang1436
        23
    liangkang1436  
       2022-09-10 10:41:18 +08:00 via Android
    强烈不建议用 map 传参,代码的可读性和可维护性都会特别差,尽量使用类型参数,用面向对象的思想封装参数,将来你看自己的代码,到处都是 map ,不调试不根本不知道里面到底都是啥内容
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5168 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 52ms UTC 03:48 PVG 11:48 LAX 20:48 JFK 23:48
    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