V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
smith123
V2EX  ›  问与答

真诚发问,求助一个关于 Java 的 domain 层的疑问

  •  
  •   smith123 · 2022-09-02 22:12:17 +08:00 · 1370 次点击
    这是一个创建于 841 天前的主题,其中的信息可能已经有所发展或是发生改变。

    真诚发问,对于 java 如果多个接口想共用一个 domain 层,但是最后接口返回的字段又不一样,但这些字段都是这个 domain 的子集(排列组合),这种情况应该怎么办?

    比如:

    publica class A {
    
    	private String name;
        private Long type;
        private Long age;
        private Long height;
        private Long weight;
        private String attr;
        ........
    
    }
    
    

    对于接口 1 ,我期望的返回应该是:

    {
    	"data": [
         {"name": "1", "type": "1"},
         {"name": "1", "type": "1"},
         {"name": "1", "type": "1"}
        ]
        
        
    }
    
    

    对于接口 2 ,我期望的返回应该是:

    {
    "data": [
         {"name": "1", "age": "1", "height":"1"},
         {"name": "2", "age": "2", "height":"2"},
         {"name": "3", "age": "3", "height":"3"},
        ]
        
    }
    
    

    对于接口 3 ,我期望的返回应该是:

    {
    "data": [
         {"weight": "1", "attr": "1", "age":"1"},
         {"weight": "2", "attr": "2", "age":"2"},
         {"weight": "3", "attr": "3", "age":"3"},
        ]
        
    }
    
    

    等等等,实际上可以说接口的返回是 A 这个类属性的随机排列组合,而我又不想给每个接口单独定义 VO 的形式,所以请问我该怎么办?

    15 条回复    2022-09-04 13:00:42 +08:00
    Veneris
        1
    Veneris  
       2022-09-02 22:20:25 +08:00 via iPhone
    如果是真子集,加个 json 序列化注解,有个属性可以把为 null 的不字段不返回
    smith123
        2
    smith123  
    OP
       2022-09-02 22:22:42 +08:00
    @Veneris 但如果说,某些接口就是需要这个字段不管他是不是 null,这种情况怎么办呢?
    Veneris
        3
    Veneris  
       2022-09-02 22:24:42 +08:00 via iPhone
    @smith123 手动序列化 json ?不过这样一来还不如自定义 vo 了🤣
    optional
        4
    optional  
       2022-09-02 22:27:58 +08:00 via iPhone
    domain 层入参和返回 entity ,service 层返回 dto ,mapper 转换不同的对象
    xiangyuecn
        5
    xiangyuecn  
       2022-09-02 22:32:20 +08:00
    。。。Map 一把梭🐶
    chihiro2014
        6
    chihiro2014  
       2022-09-02 22:36:37 +08:00
    jpa projection 了解下
    crysislinux
        7
    crysislinux  
       2022-09-02 22:36:59 +08:00 via Android   ❤️ 1
    domain 不应该处理这个。你这个应该在 application 处理
    iseki
        8
    iseki  
       2022-09-02 22:37:40 +08:00
    没必要一个对象从头捅到尾,该转换转换就好了
    cpstar
        9
    cpstar  
       2022-09-02 22:48:09 +08:00
    不懂什么 domain ,但是我觉得 class A 有一个虚拟方法 toJSON ,或者还有一个接口的一个方法 toJSON(A a),然后三个接口实现类 X/Y/Z ,然后加工厂根据过来的接口 1 、2 、3 生成 X/Y/Z 进而完成 toJSON(a)。
    oneisall8955
        10
    oneisall8955  
       2022-09-02 23:01:28 +08:00 via Android
    用 mapstruct 转不同 vo ,就定义多一个实体
    qua
        11
    qua  
       2022-09-02 23:38:32 +08:00 via Android
    Jackson @JsonView
    kkeep
        12
    kkeep  
       2022-09-03 00:39:31 +08:00 via Android
    Java 就是整得概念多,你每个接口出去的时候定一个实体?或者你就声明 keys
    awalkingman
        13
    awalkingman  
       2022-09-03 08:13:17 +08:00
    @xiangyuecn 来人,把这个 map 一把梭的家伙拖出去枪毙 10 分钟
    v2eb
        14
    v2eb  
       2022-09-04 00:11:05 +08:00 via Android
    dto vo 这些多的好恶心🙊。
    Amber2011
        15
    Amber2011  
       2022-09-04 13:00:42 +08:00 via Android
    不序列化 null 值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2488 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:46 · PVG 10:46 · LAX 18:46 · JFK 21:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.