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;
}
}
Расположение сгенерированного класса реализации следующее: