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

有什么较为通用的办法解决两个实体类传递相同参数?

  •  
  •   Mrzhs · 2022-08-03 16:33:07 +08:00 · 3784 次点击
    这是一个创建于 683 天前的主题,其中的信息可能已经有所发展或是发生改变。

    码不动了,真的

    Picture

    40 条回复    2022-08-05 11:27:39 +08:00
    ppxppx
        1
    ppxppx  
       2022-08-03 16:35:48 +08:00 via Android
    BeanUtils.CopyProperties?
    hidemyself
        2
    hidemyself  
       2022-08-03 16:36:41 +08:00
    BeanUtils 吧。。或者 MapStruct
    Mrzhs
        3
    Mrzhs  
    OP
       2022-08-03 16:37:38 +08:00
    @ppxppx 我去试试
    Mrzhs
        4
    Mrzhs  
    OP
       2022-08-03 16:38:11 +08:00
    @hidemyself 感谢
    dake0805
        5
    dake0805  
       2022-08-03 16:50:43 +08:00
    我是用 IDEA 插件 https://github.com/gejun123456/intellij-generateAllSetMethod 生成,然后自己微调
    ligiggy
        6
    ligiggy  
       2022-08-03 16:54:12 +08:00
    A 继承 B ?或者继承同一个接口?
    Morii
        7
    Morii  
       2022-08-03 16:54:57 +08:00
    MapStruct 写一个 BaseMapper 然后泛型实现
    lazyfighter
        8
    lazyfighter  
       2022-08-03 16:55:18 +08:00
    MapStruct
    issakchill
        9
    issakchill  
       2022-08-03 17:07:35 +08:00   ❤️ 1
    如果只是一次性使用 推荐 idea 插件 https://plugins.jetbrains.com/plugin/7171-generateo2o
    a33291
        10
    a33291  
       2022-08-03 17:14:57 +08:00
    按说 java 应该也有一些基于反射实现的 map 库,类似 automapper 或者 tinymapper 之类的,这种只要 2 个类字段一致(不一致时可通过配置修改,但是很多时候 dto 和 entity 字段是重叠的)只需要调用一个函数即可

    楼上提到的 BeanUtils 也许就是干这事的?对 java 不太熟
    jones2000
        11
    jones2000  
       2022-08-03 17:16:40 +08:00
    成员变量太多了, 拆类
    wzcloud
        12
    wzcloud  
       2022-08-03 17:18:57 +08:00
    没有代码质量管控的话,直接用 map 呗,反正是后来者维护。
    Vaspike
        13
    Vaspike  
       2022-08-03 17:22:08 +08:00
    嫌麻烦的话直接 jackson 序列化第一个对象后填充到第二个对象,楼上各位似乎没提供这种思路,当然可能性能堪忧

    当然我平时是把相同属性放到公共父类,写一个反射的工具方法(网上应该能搜到类似的)
    LLaMA2
        14
    LLaMA2  
       2022-08-03 17:27:48 +08:00
    #13 楼的算是一种套路了,然后这种在 TS 中根本不算啥,
    WispZhan
        15
    WispZhan  
       2022-08-03 19:56:32 +08:00
    @jones2000 +1

    然后上 MapStruct
    14104chk
        16
    14104chk  
       2022-08-03 20:04:33 +08:00
    可以抽出一个类 A ,里面含有所有的公共属性(多一两个也无所谓),然后组合到 in 和 orderDetl 里面。赋值的时候,直接 in.setA(orderDetl.getA())
    xy90321
        17
    xy90321  
       2022-08-03 20:28:11 +08:00 via iPhone
    是有什么深意我没读懂吗?不是一个 Dozer BeanMapper 就解决的事情?
    Leviathann
        18
    Leviathann  
       2022-08-03 20:37:36 +08:00
    正则替换一下
    ns09005264
        19
    ns09005264  
       2022-08-03 22:32:13 +08:00
    我一般用这种方式,先用插件生成调用 setter 的代码段,配合 vim 的动作录制,快速且有静态检查
    ns09005264
        20
    ns09005264  
       2022-08-03 22:35:44 +08:00
    version0
        21
    version0  
       2022-08-03 22:39:31 +08:00
    嘿,我以前写过这种代码,当时迷信反射效率低,就手写过这种代码。🤣
    Goooooos
        22
    Goooooos  
       2022-08-03 22:44:41 +08:00 via Android
    我一般都是 beanutils.copyproperties
    Saxton
        23
    Saxton  
       2022-08-03 22:55:56 +08:00 via iPhone
    果断推荐 mapStruct 强推啊 延长寿命的东西
    Saxton
        24
    Saxton  
       2022-08-03 22:57:44 +08:00 via iPhone
    @Vaspike 强推 mapStruct 。。。 非反射 编译自动 生成方法,配合 idea 插件自动补充注解,舒服到上天
    Saxton
        25
    Saxton  
       2022-08-03 22:58:49 +08:00 via iPhone
    mapStruct 也有编译检查,字段写错类型不对会提示
    silentsky
        26
    silentsky  
       2022-08-04 00:34:17 +08:00 via Android
    如果你用 beanutil ,等有一天改属性的时候你就知道难受,至少这种方式会给你编译报错
    dqzcwxb
        27
    dqzcwxb  
       2022-08-04 01:10:18 +08:00
    @version0 #21 虽然但是,反射确实不如手写 set 效率高
    xmumiffy
        28
    xmumiffy  
       2022-08-04 01:14:40 +08:00 via Android
    Json encode&decode
    bthulu
        29
    bthulu  
       2022-08-04 08:33:56 +08:00
    字段都一样, 你为什么要用两个实体类呢, 吃饱了撑的吗?
    guanhui07
        30
    guanhui07  
       2022-08-04 08:57:32 +08:00
    mapStruct
    hahaFck
        31
    hahaFck  
       2022-08-04 10:05:10 +08:00
    java 就是实体分的太多了,大量重复的属性。
    koloonps
        32
    koloonps  
       2022-08-04 10:14:59 +08:00
    @bthulu 数据库查出来的对象比返回的参数要多
    lyxeno
        33
    lyxeno  
       2022-08-04 10:33:18 +08:00
    用 BeanUtils 后续重构好像不太方便,我这种代码现在都是用 Github Copilot 帮忙自动生成的

    然后自己写的时候注意一点,没必要的实体类就不另外新增了,减少这种重复代码
    luomao
        34
    luomao  
       2022-08-04 10:49:02 +08:00
    orika
    li24361
        35
    li24361  
       2022-08-04 10:57:09 +08:00
    @Saxton 补全插件能发一下吗?
    blackshow
        36
    blackshow  
       2022-08-04 11:26:47 +08:00
    MapStruct
    tramm
        37
    tramm  
       2022-08-04 15:58:38 +08:00
    mapstruct
    Spring 的 beanutil
    Hutool 的 beanutil...
    bthulu
        38
    bthulu  
       2022-08-04 17:53:00 +08:00
    @koloonps 这还不简单, spring 天生支持返回时过滤字段
    ruanimal
        39
    ruanimal  
       2022-08-05 10:22:55 +08:00
    @jones2000 没见过几万字段的系统吗
    jones2000
        40
    jones2000  
       2022-08-05 11:27:39 +08:00
    @ruanimal 没看出来你这个是什么系统, 不就是一个业务模块嘛。大家都是垒代码的。离做系统还远着呢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4869 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:15 · PVG 09:15 · LAX 18:15 · JFK 21:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.