【问题标题】:Convert a class to another with similar parameters (Every param has a mapping) [closed]将一个类转换为另一个具有相似参数的类(每个参数都有一个映射)[关闭]
【发布时间】:2017-12-30 21:06:52
【问题描述】:

我有一个像这样的 A 类:

A {
  ClassB b;
  String a;
}

现在还有另一个类 X 像:

X {
  ClassY y;
  String a;
}

现在,ClassY 和 ClassB 一样,比如:

ClassB/ClassY {
  String b;
}

我想将 A 的一个实例复制到 Y 的一个新对象中。

我遇到了 Dozer,它执行类似的映射,但前提是这些值是原始的。我不明白如何映射其中的类。尝试在 java 中执行此操作。

我遇到了答案https://stackoverflow.com/a/36196948/2733350,但我在 Dozer 中找不到 MapperFactory。

【问题讨论】:

  • 推土机是您唯一的选择吗?或者你愿意做类似的事情,比如mapstruct
  • 对其中任何一个开放。我会试试这个
  • 很高兴您找到了解决问题的方法。但是,实际的答案/解决方案不应编辑到您的问题中。一般来说,您应该edit 问题来澄清问题,但不要在问题中包含答案。您应该使用用于解决问题的代码创建自己的答案,然后接受它(系统可能需要 48 小时延迟才能接受您自己的答案)。当您自己解决问题后,answering your own question is encouraged.
  • @Makyen:我将此添加为答案,但未将其标记为已接受,因为我不确定这是否是最好的方法。谢谢你的建议:)

标签: java dozer


【解决方案1】:

您可以使用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());
}

【讨论】:

  • 谢谢!这似乎有效,但我在项目中使用时遇到了一些问题,依赖冲突。我使用了 ObjectMapper。
【解决方案2】:

来自 Apache Commons 的 BeanUtils 可以解决问题:

copyProperties(对象,对象)

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

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 2017-09-09
    • 2011-04-10
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多