[Ежедневный свежий гриб] Выбор схемы быстрого копирования Spring Boot MapStruct

Микросервисы
[Ежедневный свежий гриб] Выбор схемы быстрого копирования Spring Boot MapStruct

MapStruct— это процессор аннотаций для создания безопасного по типам, высокопроизводительного и свободного от зависимостей кода сопоставления bean-компонентов. конкурентSelma.

адрес проекта:git ee.com/soft men G/tickets…

вводить

MapStruct — это процессор аннотаций Java для создания безопасных по типу классов сопоставления bean-компонентов.

Все, что вам нужно сделать, это определить интерфейс картографа, который объявляет все необходимые методы сопоставления. Во время компиляции MapStruct сгенерирует реализацию этого интерфейса. В этой реализации используются обычные вызовы методов Java для сопоставления между исходным и целевым объектами, то есть без отражения или чего-то подобного.

MapStruct экономит время, создавая утомительный и простой для написания код, по сравнению с написанием кода сопоставления вручную. Следуя соглашению, а не подходу к настройке, MapStruct использует разумные значения по умолчанию, но предпринимает действия при настройке или реализации особого поведения.

По сравнению с системами динамического картографирования MapStruct имеет следующие преимущества:

  • Быстрое выполнение за счет использования обычных вызовов методов вместо отражения

  • Безопасность типа во время компиляции: могут быть сопоставлены только объекты и свойства, которые сопоставляются друг с другом, отсутствие случайного сопоставления объектов заказа с DTO клиента и т. д.

  • Очищайте отчеты об ошибках во время сборки, если

    • Неполное сопоставление (не все целевые свойства сопоставляются)

    • Неверное сопоставление (не найдено подходящего метода сопоставления или преобразования типа)

Введение компонента

mapstruct

Включите необходимые аннотации, такие как @Mapping

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.3.0.Final</version>
</dependency>

mapstruct-processor

Во время компиляции процессор аннотаций, который генерирует реализацию картографа, настраивается вpom.xmlВ плагине компиляции сборки.

 <path>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.3.0.Final</version>
</path>

IntelliJ IDEAиEclipse IDE

  • IntelliJ IDEAСоответствующий плагин можно настроитьMapstruct Support
  • Eclipse IDEможно настроитьПлагин M2E
  • Eclipse IDEНеобходимо указать в pom.xml<m2e.apt.activation>jdt_apt</m2e.apt.activation>

опции в обработчике аннотаций mapstruct-processor

Обычно настраивается вpom.xmlПлагин компиляции средней сборки

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <annotationProcessorPaths>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>1.3.0.Final</version>
            </path>
        </annotationProcessorPaths>
        <compilerArgs>
            <compilerArg>
                -Amapstruct.suppressGeneratorTimestamp=true
            </compilerArg>
            <compilerArg>
                -Amapstruct.suppressGeneratorVersionInfoComment=true
            </compilerArg>
        </compilerArgs>
    </configuration>
</plugin>
опции инструкция По умолчанию
mapstruct. suppressGeneratorTimestamp Если установлено значение true, @Generated подавляет создание временных меток в аннотациях в сгенерированных классах картографов. false
mapstruct. suppressGeneratorVersionInfoComment Если установлено значение true, подавлять создание свойства в аннотации @Generated в комментарии сгенерированного класса преобразователя. Аннотации содержат информацию о версии MapStruct и компиляторе, используемом для обработки аннотаций. false
mapstruct.defaultComponentModel Имя модели компонента (см.Получить картограф) на основе картографа, который должен быть сгенерирован. default
mapstruct.unmappedTargetPolicy Если свойства целевого объекта метода сопоставления не заполнены исходными значениями, применяется стратегия создания отчетов по умолчанию. WARN

Получить картограф

поддерживаемые значения инструкция получить экземпляр
default Картограф не использует модель компонентов, обычно извлекая экземпляр Mappers#getMapper(Class)
cdi Сгенерированный преобразователь представляет собой CDI-компонент уровня приложения. @Inject
spring Сгенерированный преобразователь представляет собой компонент Spring с одноэлементной областью видимости. @Autowired
jsr330 Сгенерированный преобразователь снабжен аннотацией {@code @Named}. @Inject

использовать

Базовая карта

Чтобы создать преобразователь, просто определите интерфейс Java с желаемым методом сопоставления и аннотируйте его аннотациями.org.mapstruct.MapperПримечания

@Mapper
public interface CardMapper {
    CardMapper INSTANCE = Mappers.getMapper(CardMapper.class);

    /**
     * card 转 CardDto .
     *
     * @param card
     * @return
     */
    @Mapping(target = "maker", source = "make")
    CardDto dto(Card card);

    /**
     * CardDt 转 card .
     *
     * @param cardDto
     * @return
     */
    @Mapping(target = "make", source = "maker")
    Card entity(CardDto cardDto);
}

Аннотация @Mapper сделаетMapStructВыполнение, созданное генератором кодаCardMapperИнтерфейс при создании процесса.

В сгенерированной реализации метода тип источника (например,Card) будут скопированы в соответствующие свойства целевого типа (например,CardDto)

  • Когда атрибут имеет то же имя, что и его целевой объект, он неявно отображается.
  • Если свойство имеет другое имя в целевом объекте, это можно сделать с помощью@MappingВ аннотации указывается его имя.

Особенности преобразования

MapStructОбщий принцип заключается в том, чтобы сгенерировать столько кода, сколько вы написали бы сами. В частности, это означает, что обычнымsetter / setterВызов вместо отражения или аналогичного копирования значений из источника в место назначения.

MapStructУчитываются все общедоступные свойства исходного и целевого типов. Сюда входят свойства, объявленные в супертипах.

MapStructсделаю кое-чтонеявное преобразование.

public class CardMapperImpl implements CardMapper {

    @Override
    public CardDto dto(Card card) {
        if ( card == null ) {
            return null;
        }

        CardDto cardDto = new CardDto();

        cardDto.setMaker( card.getMake() );
        cardDto.setName( card.getName() );
        cardDto.setNote( card.getNote() );
        cardDto.setImage( card.getImage() );
        cardDto.setCreateTime( card.getCreateTime() );
        cardDto.setPrice( card.getPrice() );

        return cardDto;
    }

    @Override
    public Card entity(CardDto cardDto) {
        if ( cardDto == null ) {
            return null;
        }

        Card card = new Card();

        card.setMake( cardDto.getMaker() );
        card.setName( cardDto.getName() );
        card.setNote( cardDto.getNote() );
        card.setImage( cardDto.getImage() );
        card.setCreateTime( cardDto.getCreateTime() );
        card.setPrice( (int) cardDto.getPrice() );

        return card;
    }
}

Расположение сгенерированного класса реализации следующее:位置