使用类似参数将类转换为另一个类(每个参数都有一个映射)

时间:2017-12-30 21:06:52

标签: java dozer

我有一个类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。

2 个答案:

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

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();
        }
    }
}

我希望这会有所帮助。