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

是否有 Java 类库可以对的 Java Bean 进行一些额外的处理逻辑

  •  
  •   lihongjie0209 · 2020-01-13 15:41:10 +08:00 · 4900 次点击
    这是一个创建于 1806 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对于一些第三方的数据总是要进行一些处理然后才能进入业务逻辑

    Class PoJo {
    
    
    
    	@Trim
    	private String name;
    
    	@Default(value= new Date())
         private Date date;
    
    
    }
    

    对于 Trim 来说, 如果第三方传过来的 name = "hello " , 那么经过处理之后 name="hello" .

    30 条回复    2020-01-19 09:55:22 +08:00
    guyeu
        1
    guyeu  
       2020-01-13 15:54:31 +08:00
    没有。感觉这种东西不但没办法解决问题,还会造成问题。。
    lihongjie0209
        2
    lihongjie0209  
    OP
       2020-01-13 15:55:46 +08:00
    @guyeu #1 有什么问题?
    xbigfat
        3
    xbigfat  
       2020-01-13 15:58:44 +08:00
    我觉得可以自己实现这个注解
    joichuai
        4
    joichuai  
       2020-01-13 16:01:19 +08:00
    mark 下等大佬回复,自己平时遇到的顶多是下划线驼峰互相转,复杂业务都自己代码里转换了。
    xiaoyu03
        6
    xiaoyu03  
       2020-01-13 16:06:51 +08:00
    Spring 的话用实现 AnnotationFormatterFactory 接口自定义注解可不可行?
    lihongjie0209
        7
    lihongjie0209  
    OP
       2020-01-13 16:08:16 +08:00
    @sonyxperia #5 我希望是一个和框架无关的实现, 只要符合 Java Bean 的规范就好了, 你没办法保证用户的输入从哪里来, 如果这些输入是从一个 Json 文件中读取出来的, 那么 Spring MVC 那一套就没办法用了
    lihongjie0209
        8
    lihongjie0209  
    OP
       2020-01-13 16:08:36 +08:00
    @xiaoyu03 #6 我希望是一个和框架无关的实现, 只要符合 Java Bean 的规范就好了, 你没办法保证用户的输入从哪里来, 如果这些输入是从一个 Json 文件中读取出来的, 那么 Spring MVC 那一套就没办法用了
    lihongjie0209
        9
    lihongjie0209  
    OP
       2020-01-13 16:09:05 +08:00
    @xbigfat #3 想问一下有没有现成的方案
    Cbdy
        10
    Cbdy  
       2020-01-13 16:10:50 +08:00 via Android
    可以考虑自定义 getter
    lihongjie0209
        11
    lihongjie0209  
    OP
       2020-01-13 16:12:19 +08:00
    @Cbdy #10 如果作为一个 Data Entity, 有可能是你这边处理一遍之后再序列化然后发送给别的程序, 那么 getter 中的逻辑是没办法被序列化的
    Raymon111111
        12
    Raymon111111  
       2020-01-13 16:15:39 +08:00
    拦截在方法上?
    guyeu
        13
    guyeu  
       2020-01-13 16:18:52 +08:00
    @lihongjie0209 #2 根据约定,JavaBeans 一定是可以被序列化的,你展示的注解给序列化和反序列化带来了不确定和不一致,由此可能产生无数 bug。
    lihongjie0209
        14
    lihongjie0209  
    OP
       2020-01-13 16:21:31 +08:00
    @guyeu #13
    我希望的是这样的
    ```
    pojo.setName(Strings.trim(pojo.getName()))
    ```
    所以并不会破坏 JavaBean 的规范
    chendy
        15
    chendy  
       2020-01-13 16:30:12 +08:00
    默认你用的是 jackson…
    直接 trim 字符串 https://stackoverflow.com/questions/6852213/
    默认值考虑用 Option 实现一下?
    lihongjie0209
        16
    lihongjie0209  
    OP
       2020-01-13 16:33:34 +08:00
    @chendy #15 和 jackson 没关系, 我有一个

    pojo = new pojo("hello ", null)

    我想找一个 library

    newPojo = library.process(pojo)

    assertEquals(newPojo.getName(), "hello")
    assertTrue(newPojo.getDate()!=null)
    junbaor
        17
    junbaor  
       2020-01-13 16:38:16 +08:00 via iPhone
    如果要求是 get 方法返回的被处理,可以研究一下 lombok 的思路
    chendy
        18
    chendy  
       2020-01-13 16:45:20 +08:00
    @lihongjie0209 emm…感觉可以自己反射一把梭了…
    lihongjie0209
        19
    lihongjie0209  
    OP
       2020-01-13 16:51:10 +08:00
    @chendy #18 嗯, 没有合适的类库只能这样了
    Cbdy
        20
    Cbdy  
       2020-01-13 16:58:01 +08:00
    @lihongjie0209 其实你的需求很简单,完全可以自己写一个
    clf
        21
    clf  
       2020-01-13 16:59:34 +08:00
    自己定义一个 @Trim 注解,定义一个拦截器或切面,对请求参数的所有 field 进行检查,找到 @Trim 注解的就去检查格式是否符合,不符合的处理后继续。
    lihongjie0209
        22
    lihongjie0209  
    OP
       2020-01-13 17:04:03 +08:00
    @Cbdy #20 我之前认为 BeanUtil 的 copy 很简单, 知道我遇到了 MapStruct 我才知道还能这么玩
    xxdd
        23
    xxdd  
       2020-01-13 17:49:44 +08:00
    MapStruct 这个测过效率没 一直没测过
    lux182
        24
    lux182  
       2020-01-13 17:54:09 +08:00
    bean 只用了 lombok。
    optional
        25
    optional  
       2020-01-13 17:54:18 +08:00 via iPhone
    要想不依赖框架,只能用 annotation processor
    Octopvs
        26
    Octopvs  
       2020-01-13 19:30:05 +08:00
    其实 BeanUtils 这些都是对 Bean 的 set 方法进行一个调用,那么可以在 set 方法里做一些手脚; A->A1->A,A1 的 set 方法做过手脚,那么就可以实现一个快速的转换。
    Person person = new Person(1L,"li",20);
    PersonU pu = new PersonU();
    BeanUtils.copyProperties(person,pu);
    BeanUtils.copyProperties(pu,person);
    System.out.println(person);
    在 PersonU 中的 set 进行一个年龄+1
    lihongjie0209
        27
    lihongjie0209  
    OP
       2020-01-13 20:29:18 +08:00
    @xxdd #23 目测是最好的, 完全代码生成, 不涉及反射
    KentY
        28
    KentY  
       2020-01-13 21:58:44 +08:00
    @xxdd MapStruct 是常见的 mapping frameworks(相比 jmapper, dozer, modelmapper, orika)里性能最高的.
    szq8014
        29
    szq8014  
       2020-01-17 11:09:24 +08:00
    感觉可以看看 lombok enhance 一下
    liuzhaowei55
        30
    liuzhaowei55  
       2020-01-19 09:55:22 +08:00
    这应该就是 set,get 存在的意义吧,不然就是为了 private 而 private
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1155 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:33 · PVG 02:33 · LAX 10:33 · JFK 13:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.