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

Spring controller 的两个问题

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

    3. 严重不建议使用 Map 接收参数,严重不建议接 HttpServleetRequest 再自己解析参数
    heliotrope
        8
    heliotrope  
       288 天前
    @chendy
    为什么不建议自己解析参数呢?

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

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

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

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