Spring controller 的两个问题

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

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/813135

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX