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

Spring controller 的两个问题

  •  
  •   monster1priest · 2021-11-04 20:29:15 +08:00 via iPhone · 3230 次点击
    这是一个创建于 1114 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个 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   ·   实用小工具   ·   940 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:09 · PVG 06:09 · LAX 14:09 · JFK 17:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.