将 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://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.html

示例代码可从 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());
}