【发布时间】:2019-06-26 10:55:02
【问题描述】:
这是我的用例:
我有 4 个班级 A、B、C、D
- A 类包含一个对象(B 类)和一个对象列表(C 类)
- B 类包含一个对象(D 类)
我想克隆 A 类,并递归地将 id 设置为 null。
这里是一个例子:
public class ClassA {
private Long id;
private String name;
private boolean ok;
private ClassB classB;
private List<ClassC> classCList;
}
public class ClassB {
private Long id;
private String name;
private ClassD classD;
}
public class ClassC{
private Long id;
private String name;
}
public class ClassD{
private Long id;
private String name;
}
我开发了两个函数来实现它:
第一种方法:
public ClassA prepareClassA(ClassA detail) {
Optional.ofNullable(detail).ifPresent( detail -> {
detail.setId(null);
Optional.ofNullable(detail).map(ClassA::getClassB)
.ifPresent(objectB -> objectB.setId(null));
Optional.ofNullable(detail).map(ClassA::getClassB).map(ClassB::getClassD)
.ifPresent(objectB -> objectB.setId(null));
Optional.ofNullable(detail).map(ClassA::getClassCList).
.ifPresent(items -> items.stream().forEach(item -> {
item.setId(null);
}));
}
}
第二种方法:(包括dozerMapper)
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
我使用了 DozerBeanMapper 实现
public ClassA prepareClassA(ClassA detail) {
ClassA objectA = new ClassA();
DozerBeanMapper dozerBeanMapper = new DozerBeanMapper();
BeanMappingBuilder bean = beanMappingBuilder(ClassA.class);
dozerBeanMapper.addMapping(bean);
Optional.ofNullable(detail).ifPresent(detail -> dozerBeanMapper.map(detail, objectA));
return details;
}
public BeanMappingBuilder beanMappingBuilder(Class<?> source) {
return new BeanMappingBuilder() {
@Override
protected void configure() {
mapping(source, source,
TypeMappingOptions .wildcard(true)
//Here i have to do my work ?
//TypeMappingOptions.mapNull(true)
);
}
};
}
我想要这个结果:
ClassA testA = new ClassA();
//fill all the objects in objectA with id != null
ClassA testA_convert = prepareClassA(testA);
// testA_convert.getId() must be null
// testA_convert.getClassB().getId() must be null
// testA_convert.getClassB().getClassD().getId() must be null
// testA_convert.getClassCList().forEach( element -> element.getId() must be null
问题:
- 是否有任何现有的库可以解决我的问题?
- DozerMapper 能做到吗?
- 最好的方法是什么?
最好的问候
【问题讨论】:
-
需求中已经有错误。
-
你能解释一下吗?你在说什么要求?
-
克隆这样一个对象图并将 ids 设置为
null的要求。除此之外,如果确实需要这样的操作,请向这些执行操作的类添加一个方法。 -
@Holger 看到:github rep - deep cloning
标签: java spring-boot java-8 java-stream dozer