场景
做国土项目的时候遇到了个类似头疼的问题,就是展现数据
由于要计算统计土地的面积,精度要求,所以 pojo 中用的 BigDecimal 类型,但是在展示的时候类似于表格的形式,没有数据默认就是不填,想来想去还是第三种样式比较方便,前端也好处理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15{
"applyLandArea": 14.6121,
"xxxLandArea": null,
"xxxLandArea": null
}
{
"applyLandArea": 14.6121,
"xxxLandArea": 0,
"xxxLandArea": 0
}
{
"applyLandArea": 14.6121,
"xxxLandArea": “”,
"xxxLandArea": “”
}
dozer 也是最近接触的,以前老是自己手动转换,当属性的数量多起来,伴随着大量的 set 方法,dozer 解决了这部分问题,当你转换的属性比较多并且类型不等的时候,这个时候就需要自己定义转换器
1 | //类级别 |
核心代码
自定义转换器必须实现 CustomConverter 接口
重写 convert 方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50public class LandActualConverter implements CustomConverter {
public Object convert(Object destination, Object source, Class<?> destinationClass, Class<?> sourceClass) {
// 如果满足条件,进行转换
final String emptyStr = "";
boolean havevalue = source instanceof LandActual && Objects.equals(destinationClass, LandActualVm.class);
if (havevalue) {
destination = new LandActualVm();
Field[] fields = source.getClass().getDeclaredFields();
for (Field field : fields) {
Class<?> type = field.getType();
String fieldName = field.getName();
Object value = BeanConverter.invokeGet(source, fieldName);
String baseValue = value + emptyStr;
// 如果为不为null,全部正常处理
if (value != null) {
if (Objects.equals(type, Short.class)) {
BeanConverter.invokeSet(destination, fieldName, new Short(baseValue));
}
if (Objects.equals(type, String.class)) {
BeanConverter.invokeSet(destination, fieldName, baseValue);
}
if (Objects.equals(type, Date.class)) {
BeanConverter.invokeSet(destination, fieldName, DateUtils.parse(baseValue));
}
if (Objects.equals(type, BigDecimal.class)) {
BeanConverter.invokeSet(destination, fieldName, baseValue);
}
// 如果为null,将空值转变成""
} else {
if (Objects.equals(type, Short.class)) {
}
if (Objects.equals(type, String.class)) {
}
if (Objects.equals(type, Date.class)) {
}
if (Objects.equals(type, BigDecimal.class)) {
BeanConverter.invokeSet(destination, fieldName, emptyStr);
}
}
}
return destination;
} else {
return new LandActualVm();
}
}
反射实现通用性
1 | public class BeanConverter { |