MapStruct: поля из разных сущностей сопоставляются с одной и той же сущностью Разные поля

У меня есть классы A, B и C. Класс A имеет три переменные, и он заполняется на основе разных полей классов B и C. Когда я использую mapper для заполнения объекта, сохраняются только последние использованные значения mapper. Как я могу убедиться, что все значения заполнены. Я использую MapStruct mapper (версия 1.2.0) с Spring Boot версии 2.0.3

Sample code below:
Class A{

  String a;
  String b;
  String c;

  }

Class B{
 String b1;
}

Class C{
    String c1;
}

public interface AtoCmapper{
  @Mappings({
      @Mapping(target = "c", source = "source.c1")
  })
  A CtoA(C source);

  @Mappings({
      @Mapping(target = "c1", source = "source.c")
  })
  C AtoC(A source);
}

public interface AtoBmapper{
  @Mappings({
      @Mapping(target = "b", source = "source.b1")
  })
  A BtoA(B source);

  @Mappings({
      @Mapping(target = "b1", source = "source.b")
  })
  B AtoB(A source);
}

Class DAO{

 @Autowired
 AtoBmapper aToBMapper;

 @Autowired
 AtoCmapper aToCMapper;

 public void testMapping(){
  A aObject = new A();

  aObject = aToBMapper(bObject); // Assume bObject is object to Type B and it is initialized properly

  aObject = aToCMapper(cObject); // Assume cObject is object to Type B and it is initialized properly
 }

 //Now when I call testMapping() resulting A object only has value set for variable c, value of b is lost.
 How can I make sure that Values from B and C are set properly to Class A
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
2 054
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

MapStruct может обновить существующие экземпляры! Для этого введите новые методы сопоставления (или замените старые) вариантами, которые имеют второй аннотированный параметр @MappingTarget типа A (и в этом случае можно заменить тип возвращаемого значения на void):

// In AtoBmapper
@Mappings(...)
void updateAFromB(B source, @MappingTarget A target);

// In AtoCmapper
@Mappings(...)
void updateAFromC(C source, @MappingTarget A target);

Тогда вы можете написать:

A aObject = new A();

aToBMapper.updateAFromB(bObject, aObject);
aToCMapper.updateAFromC(cObject, aObject);

// now aObject should contain the cumulated data from b and c

Любая идея аналогичного метода, доступного в Джексоне, который считывает строку в уже доступный объект?

user1575601 23.10.2018 02:19

Поиск в Google «Джексон обновить существующий объект» дал мне следующее: stackoverflow.com/questions/9895041/…

Hero Wanders 23.10.2018 07:38

Взглянем. Спасибо, мне кажется, это может послужить моей цели.

user1575601 23.10.2018 19:36

Другие вопросы по теме