将POJO字段复制到另一个POJO的setter方法中

7

假设我有一个类 A,它有公共字段 xy。再假设我还有另一个使用setter和getter的POJO类 B,所以它具有 setX() 和 setY() 方法。

我想要使用某种自动方式从 A 的实例复制到 B,并可以反过来进行操作。

至少在默认设置下,Dozer的

   Mapper mapper = new DozerBeanMapper();
   B b = mapper.map(a, B.class);

不正确地复制了字段。

那么有没有一个简单的配置更改让我用Dozer或其他库来实现上述功能呢?


你尝试过使用JAXB、ObjectMapper吗?或者你只想使用Dozer? - dev2d
没有,我很乐意使用任何可以在上述情况下提供“一行转换”的库。 - vertti
你想使用JAXB,它是基于注解的绑定,所以我认为它适合你。请查看http://wiki.fasterxml.com/JacksonDocumentation和同一页上的教程。 - dev2d
3个回答

4

好的,ModelMapper可以完成这项工作,但有一个需要注意的地方,你必须启用字段映射:mapper.getConfiguration().setFieldMatchingEnabled(true); - vertti

1

我不是一个单行代码,但这种方法不需要任何库。

我使用以下类进行测试:

  private class A {
    public int x;
    public String y;

    @Override
    public String toString() {
      return "A [x=" + x + ", y=" + y + "]";
    }
  }

  private class B {
    private int x;
    private String y;

    public int getX() {
      return x;
    }

    public void setX(int x) {
      System.out.println("setX");
      this.x = x;
    }

    public String getY() {
      return y;
    }

    public void setY(String y) {
      System.out.println("setY");
      this.y = y;
    }

    @Override
    public String toString() {
      return "B [x=" + x + ", y=" + y + "]";
    }
  }

要获取公共字段,我们可以使用反射,而对于 setters,最好使用 bean 工具:

public static <X, Y> void copyPublicFields(X donor, Y recipient) throws Exception {
    for (Field field : donor.getClass().getFields()) {
      for (PropertyDescriptor descriptor : Introspector.getBeanInfo(recipient.getClass()).getPropertyDescriptors()) {
        if (field.getName().equals(descriptor.getName())) {
          descriptor.getWriteMethod().invoke(recipient, field.get(donor));
          break;
        }
      }
    }
  }

测试:

final A a = new A();
a.x = 5;
a.y = "10";
System.out.println(a);
final B b = new B();
copyPublicFields(a, b);
System.out.println(b);

它的输出是:

A [x=5, y=10]
setX
setY
B [x=5, y=10]

1

如果你还在寻找,可以尝试使用 Gson

Gson gson = new Gson();
Type type = new TypeToken<YourPOJOClass>(){}.getType();
String data = gson.toJson(workingPOJO);
coppiedPOJO = gson.fromJson(data, type);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接