Установка nullValueMappingStrategy на уровне конфигурации mapper / mapper для категорий отображений - PullRequest
0 голосов
/ 29 марта 2019

В документации MapStruct есть следующие сведения о разумных значениях по умолчанию, выбранных для NullValueMappingStrategy.RETURN_DEFAULT:

Отображение бина: будет возвращен «пустой» целевой бин с за исключением констант и выражений, они будут заполнены при нет.

Примитивы: будут возвращены значения по умолчанию для примитивов, например, false для логического или 0 для int.

Итерируемые / Массивы: будет возвращен пустой итерируемый.

Карты: будет возвращена пустая карта.

Проблема в том, что мы хотим иметь возможность указать на уровне @Mapper, что, например, Iterables должен иметь NullValueMappingStrategy.RETURN_DEFAULT, но не примитивы. Причина этого в том, что пустая итерация является разумным значением по умолчанию для нашего варианта использования, но 0 не является разумным значением по умолчанию для int. Мы бы предпочли не иметь, например, объявлять:

    @IterableMapping(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)

для каждого повторяемого отображения, которое мы отображаем.

Предоставляет ли MapStruct чистый способ сделать это, которого я не нахожу в документации?

1 Ответ

0 голосов
/ 05 апреля 2019

Я думаю, что приведенная выше строка на самом деле является ошибкой копирования-вставки в документации.Чтобы пояснить: NullValueMappingStrategy применяется только к аргументам методов отображения.Не для бобовых свойств. не можно определить примитивный аргумент в качестве источника в методе отображения bean-компонентов.

Однако можно определить non-bean-компоненты в качестве источника метода отображения bean-компонентов.Подобно методу mapFrom, приведенному ниже:

package org.mapstruct.ap.test.bugs._xyz;

import java.util.List;

import org.mapstruct.Mapper;
import org.mapstruct.NullValueMappingStrategy;
import org.mapstruct.factory.Mappers;

@Mapper( nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
public interface XyzMapper {

    XyzMapper INSTANCE = Mappers.getMapper(XyzMapper.class);

    Target map(Source source);

    Target mapFrom( Integer myInt, List<Integer> myList);

    class Source {

        private int myInt;
        private List<Integer> myList;

        public int getMyInt() {
            return myInt;
        }

        public void setMyInt(int myInt) {
            this.myInt = myInt;
        }

        public List<Integer> getMyList() {
            return myList;
        }

        public void setMyList(List<Integer> myList) {
            this.myList = myList;
        }
    }

    class Target {

        private int myInt;
        private List<Integer> myList;

        public int getMyInt() {
            return myInt;
        }

        public void setMyInt(int myInt) {
            this.myInt = myInt;
        }

        public List<Integer> getMyList() {
            return myList;
        }

        public void setMyList(List<Integer> myList) {
            this.myList = myList;
        }
    }


}

При использовании NullValueMappingStrategy.RETURN_DEFAULT mapFrom вернет пустой Target, как указано в документации.

Эта строка должна бытьудалено из документации относительно NullValueMappingStrategy: Primitives: the default values for primitives will be returned, e.g. false for boolean or 0 for int.

...