Установка стратегии значений по умолчанию с несколькими исходными объектами в MapStruct

#java #mapstruct

#Ява #структура карты

Вопрос:

Я хочу создать проверки на пустоту сопоставленных свойств моих исходных объектов и установить значение по умолчанию, если действительно исходное свойство равно null.

Я пытался использовать стратегию NullValuePropertyMappingStrategy.УСТАНОВИТЕ значение по умолчанию для @Mapper, а также для целей @Mapping, но сгенерированный код не включал установщики по умолчанию..

Так что в основном то, чего я пытаюсь достичь, это:

 @Mapper(componentModel = "spring") public interface OperationDataMapper {   OperationDTO from(Object 1 o1, Object2 o2); }  

Так что мой сгенерированный код станет:

 @Component public class OperationDataMapperImpl implements OperationDataMapper {   @Override   public OperationDTO from(Object 1 o1, Object2 o2) {  if ( o1 == null amp;amp; o2 == null ) {  return null;  }   OperationDTO operationDTO = new OperationDTO();   if ( o1 != null ) {  if(o1.getProp1() != null) {  operationDTO.setProp1( o1.getProp1() )  } else {  operationDTO.setProp1( "" ) // if property is a string for example  }  .  .  }    if ( o2 != null ) {  if(o2.getProp2() != null) {  operationDTO.setProp2( o2.getProp2() )  } else {  operationDTO.setProp2( "" ) // if property is a string for example  }  .  .  }    return operationDTO;  } }  

Я не написал свой пример со стратегией значений по умолчанию, как указано в документации, потому что он не работал при моих попытках сопоставить вложенные свойства со значениями null.. Достаточно интересно, что стратегия NullValueCheckStrategy работает без каких-либо проблем, а стратегия NullValuePropertyMappingStrategy-нет.

Я также попытался установить их с помощью @BeanMapping, но безрезультатно.

Если бы кто-нибудь мог, пожалуйста, указать мне правильное направление, я был бы признателен!

Ответ №1:

Он NullValuePropertyMappingStrategy предназначен для использования для сопоставления обновлений. Если вы хотите, чтобы это было применено, вам придется предоставить OperationDTO @MappingTarget разрешение .

Единственный способ достичь того, что вы ищете, — это использовать Mapping#defaultValue или Mapping#defaultExpression