#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 будет использовать его для выполнения сопоставления. Возможно, вы можете привести пример того, что вы ожидаете от MapStruct3. @Филип , большое спасибо, что уделил время проверке моего запроса. В основном я пытаюсь сопоставить целевой объект с 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 будут равны нулю одновременно