我有一个类A:
A {
ClassB b;
String a;
}
现在还有另一个类X:
X {
ClassY y;
String a;
}
现在,ClassY与ClassB相同,如:
ClassB/ClassY {
String b;
}
我想将A的实例复制到Y的新对象中。
我遇到了Dozer,它执行类似的映射但是如果值是原始的那样。我无法理解如何在其中映射类。试着在java中这样做。
我遇到了答案innerHTML
,但我在Dozer中找不到MapperFactory。
答案 0 :(得分:2)
您可以使用MapStruct。它对复杂的对象非常好。
要按照您的示例,我创建了一个可以相应调整的映射器(@Data
来自lombok):
@Data
public class A {
private B b;
private String a;
}
@Data
public class B {
private String b;
}
@Data
public class Y {
private String b;
}
现在您可以定义实际的映射器:
@Mapper
public interface AMapper {
AMapper INSTANCE = Mappers.getMapper(AMapper.class);
@Mapping(source = "b.b", target = "b")
Y aToY(A a);
}
小单元测试:
@Test
public void shouldMapAToY() {
A a = new A();
a.setA("a variable");
final B b = new B();
b.setB("stuff from class b");
a.setB(b);
Y y = AMapper.INSTANCE.aToY(a);
assertThat(y).isNotNull();
assertThat(y.getB()).isEqualTo(b.getB());
}
答案 1 :(得分:1)
来自Apache Commons的BeanUtils可以解决这个问题:
copyProperties(Object,Object)
https://github.com/johanwitters/stackoverflow-copyProperties
提供的示例代码package com.johanw.stackoverflow.copy;
public class ClassB {
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
String b;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ClassB) && !(o instanceof ClassY)) return false;
if (o instanceof ClassB) {
ClassB classB = (ClassB) o;
return b != null ? b.equals(classB.b) : classB.b == null;
} else {
ClassY classY = (ClassY) o;
return b != null ? b.equals(classY.b) : classY.b == null;
}
}
}
package com.johanw.stackoverflow.copy;
public class ClassY {
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
String b;
}
package com.johanw.stackoverflow.copy;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.Assert;
import org.junit.Test;
import java.lang.reflect.InvocationTargetException;
public class TestCopy {
@Test
public void test() {
ClassB b = new ClassB();
b.b = "Hallo";
ClassY y = new ClassY();
try {
Assert.assertFalse(b.equals(y));
BeanUtils.copyProperties(b, y);
Assert.assertTrue(b.equals(y));
} catch (IllegalAccessException e) {
Assert.fail(e.toString());
e.printStackTrace();
} catch (InvocationTargetException e) {
Assert.fail(e.toString());
e.printStackTrace();
}
}
}
我希望这会有所帮助。