V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
lihongjie0209
V2EX  ›  Java

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

  •  
  •   lihongjie0209 · Jan 13, 2020 · 5670 views
    This topic created in 2296 days ago, the information mentioned may be changed or developed.

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

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

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

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

    pojo = new pojo("hello ", null)

    我想找一个 library

    newPojo = library.process(pojo)

    assertEquals(newPojo.getName(), "hello")
    assertTrue(newPojo.getDate()!=null)
    junbaor
        17
    junbaor  
       Jan 13, 2020 via iPhone
    如果要求是 get 方法返回的被处理,可以研究一下 lombok 的思路
    chendy
        18
    chendy  
       Jan 13, 2020
    @lihongjie0209 emm…感觉可以自己反射一把梭了…
    lihongjie0209
        19
    lihongjie0209  
    OP
       Jan 13, 2020
    @chendy #18 嗯, 没有合适的类库只能这样了
    Cbdy
        20
    Cbdy  
       Jan 13, 2020
    @lihongjie0209 其实你的需求很简单,完全可以自己写一个
    clf
        21
    clf  
       Jan 13, 2020
    自己定义一个 @Trim 注解,定义一个拦截器或切面,对请求参数的所有 field 进行检查,找到 @Trim 注解的就去检查格式是否符合,不符合的处理后继续。
    lihongjie0209
        22
    lihongjie0209  
    OP
       Jan 13, 2020
    @Cbdy #20 我之前认为 BeanUtil 的 copy 很简单, 知道我遇到了 MapStruct 我才知道还能这么玩
    xxdd
        23
    xxdd  
       Jan 13, 2020
    MapStruct 这个测过效率没 一直没测过
    lux182
        24
    lux182  
       Jan 13, 2020
    bean 只用了 lombok。
    optional
        25
    optional  
       Jan 13, 2020 via iPhone
    要想不依赖框架,只能用 annotation processor
    Octopvs
        26
    Octopvs  
       Jan 13, 2020
    其实 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
       Jan 13, 2020
    @xxdd #23 目测是最好的, 完全代码生成, 不涉及反射
    KentY
        28
    KentY  
       Jan 13, 2020
    @xxdd MapStruct 是常见的 mapping frameworks(相比 jmapper, dozer, modelmapper, orika)里性能最高的.
    szq8014
        29
    szq8014  
       Jan 17, 2020
    感觉可以看看 lombok enhance 一下
    liuzhaowei55
        30
    liuzhaowei55  
       Jan 19, 2020
    这应该就是 set,get 存在的意义吧,不然就是为了 private 而 private
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5624 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 138ms · UTC 08:36 · PVG 16:36 · LAX 01:36 · JFK 04:36
    ♥ Do have faith in what you're doing.