将 class 转换为具有相似参数的另一个(每个参数都有一个映射)
Convert a class to another with similar parameters (Every param has a mapping)
我有一个class个赞:
A {
ClassB b;
String a;
}
现在还有一个 class X 喜欢:
X {
ClassY y;
String a;
}
现在,ClassY 与 ClassB 相同,例如:
ClassB/ClassY {
String b;
}
我想将 A 的实例复制到 Y 的新对象中。
我遇到了做类似映射的 Dozer,但那是在值是原始值的情况下。我无法理解如何映射其中的 classes。尝试在 java.
中执行此操作
我找到了答案 但我在 Dozer 中找不到 MapperFactory。
Apache Commons 的 BeanUtils 可以解决问题:
复制属性(对象,对象)
示例代码可从 https://github.com/johanwitters/Whosebug-copyProperties
获得
package com.johanw.Whosebug.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.Whosebug.copy;
public class ClassY {
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
String b;
}
package com.johanw.Whosebug.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();
}
}
}
希望对您有所帮助。
您可以使用 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());
}
我有一个class个赞:
A {
ClassB b;
String a;
}
现在还有一个 class X 喜欢:
X {
ClassY y;
String a;
}
现在,ClassY 与 ClassB 相同,例如:
ClassB/ClassY {
String b;
}
我想将 A 的实例复制到 Y 的新对象中。
我遇到了做类似映射的 Dozer,但那是在值是原始值的情况下。我无法理解如何映射其中的 classes。尝试在 java.
中执行此操作我找到了答案
Apache Commons 的 BeanUtils 可以解决问题:
复制属性(对象,对象)
示例代码可从 https://github.com/johanwitters/Whosebug-copyProperties
获得package com.johanw.Whosebug.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.Whosebug.copy;
public class ClassY {
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
String b;
}
package com.johanw.Whosebug.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();
}
}
}
希望对您有所帮助。
您可以使用 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());
}