Spring controller 的两个问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
monster1priest
V2EX    Java

Spring controller 的两个问题

  •  
  •   monster1priest 2021-11-04 20:29:15 +08:00 via iPhone 3649 次点击
    这是一个创建于 1437 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个 post 请求,接受参数映射 pojo ,参数的 key 和 pojo 变量名不同该怎么办?
    另外,我尝试以 Map 类型接收参数,提示我是一个接口,无法实例化,那么有别的方法生成 map 吗?
    19 条回复    2021-11-06 23:38:50 +08:00
    clickhouse
        1
    clickhouse  
       2021-11-04 20:36:15 +08:00   2
    chihiro2014
        2
    chihiro2014  
       2021-11-04 21:30:11 +08:00
    用 Vo ,接收参数不行么=。=,VO=》 Pojo
    taofoo
        3
    taofoo  
       2021-11-04 21:48:57 +08:00
    Map 的话尝试下 HashMap
    taofoo
        4
    taofoo  
       2021-11-04 21:49:20 +08:00
    @taofoo Map 确实是一个借口
    Vegetable
        5
    Vegetable  
       2021-11-04 21:56:47 +08:00
    @chihiro2014 VO 和 POJO 是一个层面的定义吗? Value Object 不是 POJO 吗
    Kilerd
        6
    Kilerd  
       2021-11-04 22:30:53 +08:00
    先用一个 request 来接 http 进来的参数,然后用一个 mapper 把 request 转到 domian 里面的 entity 就好了。
    chendy
        7
    chendy  
       2021-11-04 22:42:15 +08:00
    1. 如果是 json 的话就一楼的注解,否则的话建议直接写一个新类专门做这个参数接收,然后再转换过去
    2. 实测 RequestBody 的话可以用 Map 接

    3. 严重不建议使用 Map 接收参数,严重不建议接 HttpServleetRequest 再自己解析参数
    heliotrope
        8
    heliotrope  
       2021-11-05 09:36:32 +08:00
    @chendy
    为什么不建议自己解析参数呢?

    后端如果全部用 RequestBody 会很痛苦 一两个参数都得定义一个 Bean
    一会用 RequestBody 一会用 RequestParam
    前端又会 BB

    自己解析就很自由了
    前端都用 post json
    重写 request 自己解析到参数
    想用 RequestParam 接也行 用 RequestBody 接也行
    ganning
        9
    ganning  
       2021-11-05 10:03:48 +08:00
    不建议使用 Map 接收参数
    1.key 要写死到 controller 里
    2.如果对参数有校验还要逐层解析
    3.如果入参结构复杂,controller 里一片解析,而且后边维护成本较高

    如果只是变量名不一致,一楼正解。七楼说的有道理,建议建一个新类去接收参数。在加上 @Valid 做入参校验
    (@Valid @RequestBody 新类 VO vo)
    ganning
        10
    ganning  
       2021-11-05 10:09:47 +08:00
    如果担心会出现一大堆入参 bean ,记得把参数名字尽量搞的能公用些。
    退一步说,总不会所有的请求都是 POST 吧
    Kontinue
        11
    Kontinue  
       2021-11-05 10:33:07 +08:00
    @heliotrope
    我们一般多余 3 个参数会定义 Bean

    自己解析有额外的样板代码,而且还得做数据校验,用 Bean ,简单校验都走 Spring Validation 了
    gadfly3173
        12
    gadfly3173  
       2021-11-05 10:53:16 +08:00
    按照 RESTful 的一般定义来说,请求方法是和 controller 的功能相关的,再不济只区分 get 和 post 也行,前端全都用 post json 未免也太粗暴了。不用 map 或者自己解析参数最大的原因是,通过 bean 或者 controller 的形参直接就能知道 controller 需要什么参数,而不是出现变动之后还得去看内部实现逻辑。这样对维护很友好,而且 map 也比 bean 重很多
    gadfly3173
        13
    gadfly3173  
       2021-11-05 10:57:40 +08:00
    话说 axios 之类的库都把这些操作封装的很好了,query 也可以传一个 object 进去,让 axios 自己转成 url 参数,这前端还觉得烦是不是有点怪(
    shanghai1943
        14
    shanghai1943  
       2021-11-05 15:55:04 +08:00
    现在 post 请求带的数据应该都在 body 里了吧,所以都是用 @requestbody 来接收参数。一般我是在三方接口回调的时候会用 map 或者 jsonobject 来接收参数,除此之外,都是定义一个 model 来接收比较多。requestparam 一般也用的少,直接就在方法的入参列表写参数名就好了,除非请求上的入参名称和方法的参数名称不一样才会用 requestparam ,或者是设置默认值的情况。
    notwaste
        15
    notwaste  
       2021-11-05 16:43:19 +08:00
    参数的 key 和变量名不同就新建 VO 呗 更何况 POJO 和 VO 不是一码事
    chihiro2014
        16
    chihiro2014  
       2021-11-06 00:30:24 +08:00
    @Vegetable 不是。VO= View Project ,视图层用。DTO 传输数据用,PO 相当于 Entity 了。细分还有 BO 啥的。。看具体咋用。主要作用还是区分作用域,方便日后代码重构
    Vegetable
        17
    Vegetable  
       2021-11-06 00:55:36 +08:00
    @chihiro2014 POJO 对应的实际上时 Bean 吧,根本就和 VOPODTO 不是一层的概念
    GloryJie
        18
    GloryJie  
       2021-11-06 10:37:46 +08:00
    不建议自己使用 request 对象来解析参数,还有个理由是为了保持方法的一个简单(和 request 对象解耦),和普通方法没什么区别。写单元测试也简单
    linvaux
        19
    linvaux  
       2021-11-06 23:38:50 +08:00
    form 或者 query 转 po
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2623 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 06:07 PVG 14:07 LAX 23:07 JFK 02:07
    Do have faith in what you're doing.
    ubao 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