使用对象接受参数,如何让对象只接受指定参数?

2020-07-16 16:07:02 +08:00
 Vimax

前端传参,后端使用对象接收参数。

如何过滤前端或调用接口的人多传参数。

比如:

部门表里面有:

部门 ID,
上级部门 ID,
部门名称,
部门编号,
...等信息。

如果根据:

部门 ID 修改部门名称,后端采用部门对象接受参数,如何过滤用户多传的参数,比如用户多传部门编号,导致部门编号也被更新。

由于 ORM 框架使用的是基于 Mybatis 的通用 mapper,更新数据是根据对象参数更新的

所以想在业务层做排除多余的参数,比如 new 一个空的部门对象,然后把需要的参数 set 进去,然后再传给通用 mapper 做更新。

但是觉得每个方法里面都 new 空对象 set 值也不是特别好。

有没有可以加个注解,可以只接收指定需要的参数,其他传过来的参数都过滤排除这种校验器。

使用 validator 的分组校验,目前是做参数校验,非必须参数看了也可以加 NULL 注解,但是这种要加太多的 Null 。

只用参数接收,可以避免接收到多余的参数。

如何保留使用对象接收参数,又可以过滤掉多余的参数。

1828 次点击
所在节点    Java
9 条回复
wangyanrui
2020-07-16 16:12:19 +08:00
自己封装一下 ORM 的 Update 的执行逻辑,当 ORM 框架调用时,反射发现字段上有 XX 注解,则不执行更新操作
kop1989
2020-07-16 16:13:54 +08:00
java 才疏学浅,班门弄斧请见谅。
一般这种接口我都会单独声明接口类。
接口类里只有我允许的传参参数。
这样就能让前端传参和你真正的 domain 数据结构对象隔离,防止数据污染。
然后再实现一个 copy 方法,将变量名一样的字段克隆过去。
wysnylc
2020-07-16 16:14:58 +08:00
不要把 po 当成 vo 用
qq1004108488
2020-07-16 16:25:24 +08:00
为每个业务设计一个 dto 不就得了。非要一个对象里面写上全部字段,然后又说不要,实在无语。
slyang5
2020-07-16 16:42:20 +08:00
@wysnylc 这也不是 vo 啊
cnzjl
2020-07-16 16:42:56 +08:00
如楼上所说,单独设计 dto 出来就好了,使用注解也能实现,但是貌似不太灵活
xiaoming1992
2020-07-16 17:37:02 +08:00
不直接使用前端传入的参数,而是构造一个对象接受参数后,根据自己的逻辑导出相应的参数。相当于一个中间件。
optional
2020-07-16 17:59:28 +08:00
api 层要有自己的 dto 啊,不管你叫它 xxO 或者 xxInput 或者 xxRequest.
至于你说的注解方式,其实也很简单啊。
增加一个参数注解 @RequestInput("xxx") 之类的,然后拦截器处理下就完事了。
lihongming
2020-07-17 02:48:24 +08:00
看到这个需求就想到 TypeScript 的 interface,可惜 Java 没有

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

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

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

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

© 2021 V2EX