对于一些第三方的数据总是要进行一些处理然后才能进入业务逻辑
Class PoJo {
@Trim
private String name;
@Default(value= new Date())
private Date date;
}
对于 Trim 来说, 如果第三方传过来的 name = "hello "
, 那么经过处理之后 name="hello"
.
1
guyeu 2020-01-13 15:54:31 +08:00
没有。感觉这种东西不但没办法解决问题,还会造成问题。。
|
2
lihongjie0209 OP @guyeu #1 有什么问题?
|
3
xbigfat 2020-01-13 15:58:44 +08:00
我觉得可以自己实现这个注解
|
4
joichuai 2020-01-13 16:01:19 +08:00
mark 下等大佬回复,自己平时遇到的顶多是下划线驼峰互相转,复杂业务都自己代码里转换了。
|
5
sonyxperia 2020-01-13 16:05:27 +08:00
|
6
xiaoyu03 2020-01-13 16:06:51 +08:00
Spring 的话用实现 AnnotationFormatterFactory 接口自定义注解可不可行?
|
7
lihongjie0209 OP @sonyxperia #5 我希望是一个和框架无关的实现, 只要符合 Java Bean 的规范就好了, 你没办法保证用户的输入从哪里来, 如果这些输入是从一个 Json 文件中读取出来的, 那么 Spring MVC 那一套就没办法用了
|
8
lihongjie0209 OP @xiaoyu03 #6 我希望是一个和框架无关的实现, 只要符合 Java Bean 的规范就好了, 你没办法保证用户的输入从哪里来, 如果这些输入是从一个 Json 文件中读取出来的, 那么 Spring MVC 那一套就没办法用了
|
9
lihongjie0209 OP @xbigfat #3 想问一下有没有现成的方案
|
10
Cbdy 2020-01-13 16:10:50 +08:00 via Android
可以考虑自定义 getter
|
11
lihongjie0209 OP @Cbdy #10 如果作为一个 Data Entity, 有可能是你这边处理一遍之后再序列化然后发送给别的程序, 那么 getter 中的逻辑是没办法被序列化的
|
12
Raymon111111 2020-01-13 16:15:39 +08:00
拦截在方法上?
|
13
guyeu 2020-01-13 16:18:52 +08:00
@lihongjie0209 #2 根据约定,JavaBeans 一定是可以被序列化的,你展示的注解给序列化和反序列化带来了不确定和不一致,由此可能产生无数 bug。
|
14
lihongjie0209 OP |
15
chendy 2020-01-13 16:30:12 +08:00
|
16
lihongjie0209 OP @chendy #15 和 jackson 没关系, 我有一个
pojo = new pojo("hello ", null) 我想找一个 library newPojo = library.process(pojo) assertEquals(newPojo.getName(), "hello") assertTrue(newPojo.getDate()!=null) |
17
junbaor 2020-01-13 16:38:16 +08:00 via iPhone
如果要求是 get 方法返回的被处理,可以研究一下 lombok 的思路
|
18
chendy 2020-01-13 16:45:20 +08:00
@lihongjie0209 emm…感觉可以自己反射一把梭了…
|
19
lihongjie0209 OP @chendy #18 嗯, 没有合适的类库只能这样了
|
20
Cbdy 2020-01-13 16:58:01 +08:00
@lihongjie0209 其实你的需求很简单,完全可以自己写一个
|
21
clf 2020-01-13 16:59:34 +08:00
|
22
lihongjie0209 OP @Cbdy #20 我之前认为 BeanUtil 的 copy 很简单, 知道我遇到了 MapStruct 我才知道还能这么玩
|
23
xxdd 2020-01-13 17:49:44 +08:00
MapStruct 这个测过效率没 一直没测过
|
24
lux182 2020-01-13 17:54:09 +08:00
bean 只用了 lombok。
|
25
optional 2020-01-13 17:54:18 +08:00 via iPhone
要想不依赖框架,只能用 annotation processor
|
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 |
27
lihongjie0209 OP @xxdd #23 目测是最好的, 完全代码生成, 不涉及反射
|
28
KentY 2020-01-13 21:58:44 +08:00
@xxdd MapStruct 是常见的 mapping frameworks(相比 jmapper, dozer, modelmapper, orika)里性能最高的.
|
29
szq8014 2020-01-17 11:09:24 +08:00
感觉可以看看 lombok enhance 一下
|
30
liuzhaowei55 2020-01-19 09:55:22 +08:00
这应该就是 set,get 存在的意义吧,不然就是为了 private 而 private
|