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

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

  •  
  •   Vimax · 2020-07-16 16:07:02 +08:00 · 1845 次点击
    这是一个创建于 1609 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    比如:

    部门表里面有:

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

    如果根据:

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

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

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

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

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

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

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

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

    9 条回复    2020-07-17 02:48:24 +08:00
    wangyanrui
        1
    wangyanrui  
       2020-07-16 16:12:19 +08:00
    自己封装一下 ORM 的 Update 的执行逻辑,当 ORM 框架调用时,反射发现字段上有 XX 注解,则不执行更新操作
    kop1989
        2
    kop1989  
       2020-07-16 16:13:54 +08:00   ❤️ 1
    java 才疏学浅,班门弄斧请见谅。
    一般这种接口我都会单独声明接口类。
    接口类里只有我允许的传参参数。
    这样就能让前端传参和你真正的 domain 数据结构对象隔离,防止数据污染。
    然后再实现一个 copy 方法,将变量名一样的字段克隆过去。
    wysnylc
        3
    wysnylc  
       2020-07-16 16:14:58 +08:00
    不要把 po 当成 vo 用
    qq1004108488
        4
    qq1004108488  
       2020-07-16 16:25:24 +08:00   ❤️ 1
    为每个业务设计一个 dto 不就得了。非要一个对象里面写上全部字段,然后又说不要,实在无语。
    slyang5
        5
    slyang5  
       2020-07-16 16:42:20 +08:00
    @wysnylc 这也不是 vo 啊
    cnzjl
        6
    cnzjl  
       2020-07-16 16:42:56 +08:00   ❤️ 1
    如楼上所说,单独设计 dto 出来就好了,使用注解也能实现,但是貌似不太灵活
    xiaoming1992
        7
    xiaoming1992  
       2020-07-16 17:37:02 +08:00 via Android   ❤️ 1
    不直接使用前端传入的参数,而是构造一个对象接受参数后,根据自己的逻辑导出相应的参数。相当于一个中间件。
    optional
        8
    optional  
       2020-07-16 17:59:28 +08:00   ❤️ 1
    api 层要有自己的 dto 啊,不管你叫它 xxO 或者 xxInput 或者 xxRequest.
    至于你说的注解方式,其实也很简单啊。
    增加一个参数注解 @RequestInput("xxx") 之类的,然后拦截器处理下就完事了。
    lihongming
        9
    lihongming  
       2020-07-17 02:48:24 +08:00 via iPhone
    看到这个需求就想到 TypeScript 的 interface,可惜 Java 没有
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4625 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:39 · PVG 17:39 · LAX 01:39 · JFK 04:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.