Скопируйте поля pojo в сеттеры другого pojo

Допустим, у меня есть класс A с общедоступными полями x и y. Допустим, у меня есть еще один класс pojo B, но он использует сеттеры и геттеры, поэтому у него есть setX () и setY ().

Я хотел бы использовать автоматический способ копирования из экземпляра A в B и обратно.

По крайней мере, с настройками по умолчанию, Dozer's

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

не копирует поля правильно.

Так есть ли простое изменение конфигурации, которое позволяет мне выполнить описанное выше с помощью Dozer или другой библиотеки, которая сделает это за меня?


person vertti    schedule 04.12.2013    source источник
comment
вы пробовали использовать JAXB, ObjectMapper? или вы хотите только пользовательский бульдозер?   -  person dev2d    schedule 04.12.2013
comment
Нет, не видел. Я счастлив использовать любую библиотеку, которая предлагает преобразование одной строки в вышеупомянутой ситуации.   -  person vertti    schedule 04.12.2013
comment
вы хотели бы использовать jaxb, он выполняет привязку на основе аннотаций, поэтому я думаю, что он должен работать для вас. оформить заказ wiki.fasterxml.com/JacksonDocumentation и учебное пособие на той же странице   -  person dev2d    schedule 04.12.2013


Ответы (3)


Я предлагаю вам использовать:

http://modelmapper.org/

Или взгляните на этот вопрос:

Скопируйте все значения из полей в один класс другому через отражение

Я бы сказал, что и API (BeanUtils), и ModelMapper предоставляют однострочники для копирования значений pojos в другие pojos. Взгляните @ это:

http://modelmapper.org/getting-started/

person Nikola Yovchev    schedule 04.12.2013
comment
Хорошо, ModelMapper выполняет свою работу, но есть одна проблема, вы должны включить отображение полей: mapper.getConfiguration().setFieldMatchingEnabled(true);. - person vertti; 04.12.2013

На самом деле не однострочный, но этот подход не требует никаких библиотек.

Я тестировал его с помощью этих классов:

  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 + "]";
    }
  }

Чтобы получить общедоступное поле, мы можем использовать отражение, а для сеттеров лучше использовать bean utils:

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]
person Yurii Shylov    schedule 04.12.2013

Для тех, кто все еще ищет, вы можете попробовать это с помощью Gson

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