Игнорируйте проверку на нуль в источнике , сопоставляя методы с несколькими параметрами источника

#java #mapstruct

Вопрос:

Команда, у меня есть вариант использования, связанный со структурой карты . PFB мой интерфейс

 @Mappings({  @Mapping(source = "source1.name", target = "name"),  @Mapping(source = "source2.address", target = "address"),  @Mapping(source = "source3.company", target = "company") }) public SomeClass map(Source1 source1,Source2 source2,Source3 source3);  

Все работает нормально. Но моя проблема связана с приведенным ниже фрагментом кода(который генерируется структурой карты на основе указанного выше интерфейса).

 public SomeClass map(Source1 source1,Source2 source2,Source3 source3)(  if ( source1== null amp;amp; source2== null amp;amp; source3== null ) {  return null;  }  

Здесь моя проблема в том, что я не хочу возвращать значение null в случае, если source2 и source3 равны нулю, и, скорее, я сопоставлю доступные сведения из source1 и продолжу. Я просмотрел документы mapstruct, но, к сожалению, не смог найти для этого никакого возможного решения. Есть ли у нас какое-либо решение в mapstruct для вышеуказанного случая использования или нам нужно написать пользовательскую логику для обработки вышеуказанного случая. Любой указатель здесь очень ценится и заранее благодарен.

Комментарии:

1. На данный момент я разделил эту логику на отдельные методы, основанные на исходном параметре, и использовал свойство @MappingTarget, чтобы сопоставить все значения одному объекту. Но я просто хочу проверить, есть ли у нас лучшее решение для этого использования, кроме этого.

2. Я не совсем понимаю, что вы ищете. Если source1 значение не равно нулю, то MapStruct будет использовать его для выполнения сопоставления. Возможно, вы можете привести пример того, что вы ожидаете от MapStruct

3. @Филип , большое спасибо, что уделил время проверке моего запроса. В основном я пытаюсь сопоставить целевой объект с 3 различными исходными объектами(или аргументами. если вы посмотрите на мой пример, его источник 1 источник 1,источник 2 источник 2,источник 3 источник 3). Моя проблема в том , что в классе реализации, если один из параметров(источник 1, источник 2 или источник 3 равен нулю), он пропустит сопоставление и вернет значение как null( извлечение из сгенерированного класса —если ( источник 1== null amp;amp; источник 2== null amp;amp; источник 3== null ) { возвращает значение null; })

4. Вариант, который я ищу, заключается в том, что он должен пропускать сопоставление только в том случае, если все аргументы равны нулю. если первый аргумент равен нулю, то он должен продолжить и выполнить остальную часть сопоставления с аргументом 2 (конечно, если аргумент 2 не равен нулю).

5. Сгенерированный код вернет значение null только в том случае, если все исходные аргументы равны нулю. Если какой-либо из них не равен нулю, то сгенерированное условие не совпадает, и оно продолжит сопоставление (не возвращает значение null). Я бы посоветовал вам отредактировать свой вопрос и написать, как вы ожидаете, что это условие будет выглядеть

Ответ №1:

Здесь моя проблема в том, что я не хочу возвращать значение null в случае, если source2 и source3 равны нулю, и, скорее, я сопоставлю доступные сведения из source1 и продолжу.

Глядя на сгенерированный фрагмент с помощью MapStruct, генерируется именно то, о чем вас спрашивают.

 public SomeClass map(Source1 source1, Source2 source2, Source3 source3)(  if ( source1 == null amp;amp; source2 == null amp;amp; source3 == null ) {  return null;  }   // rest of mmapping }  

Это означает , что если source1 нет null и source2 и source3 есть null , то сопоставление не вернется null , но оно будет использоваться source1 для выполнения сопоставления

Комментарии:

1. Спасибо @filip за то, что нашли время проверить запрос и ответить на этот вопрос. Мне следовало бы более четко сформулировать свой вопрос. Но в случае, если source1 равен нулю, а source2 и source3 не равны нулю, это приведет к нулю, верно?

2. Нет, это неправильно. Результат будет равен нулю, если source1, source2 и source3 будут равны нулю одновременно