一规丽、 工具介紹
一個用于對象轉(zhuǎn)換為另外一個對象的java工具類,主要適用于兩個對象的大部分屬性名稱都相同的場景撇贺。相比于Spring的BeanUtils.copyProperties()方法赌莺,還可以實現(xiàn)不同名稱字段之間的屬性賦值
二、使用步驟
以maven工程為例松嘶,引入如下依賴:
<properties>
<mapstruct.version>1.2.0.Final</mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>
- 基本使用艘狭,不同的名稱字段可以通過@Mapping或者@Mappings來映射
@Mapper
public interface CarMapper {
// Car.make屬性映射為CarDto.manufacturer,以此類推
@Mappings({
@Mapping(source = "make", target = "manufacturer"),
@Mapping(source = "numberOfSeats", target = "seatCount")
})
CarDto carToCarDto(Car car);
@Mapping(source = "name", target = "fullName")
PersonDto personToPersonDto(Person person);
}
原理就是通過@Mapper注解的類會自動生成相應(yīng)的實現(xiàn)類翠订,根據(jù)方法上的注解生成對應(yīng)的對象
- 函數(shù)參數(shù)可以是多個對象缓升,每個對象的一部分映射到返回的對象中
@Mapper
public interface AddressMapper {
@Mappings({
@Mapping(source = "person.description", target = "description"),
@Mapping(source = "address.houseNo", target = "houseNumber")
})
DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address);
}
注意:如果輸入的多個對象有相同屬性名的參數(shù),且返回對象也剛好有相同屬性名的參數(shù)蕴轨,則必須指明哪個對象的相同屬性名參數(shù)映射到返回對象中港谊,否則會報錯。
- 上述都是映射成一個新對象橙弱,如果需要將某個已存在的對象映射到一個已存在的對象中歧寺,可以采用@MappingTarget注解實現(xiàn)。
@Mapper
public interface CarMapper {
void updateCarFromDto(CarDto carDto, @MappingTarget Car car);
}
- mapstruct集成依賴注入棘脐,比如集成spring,可以通過如下方式集成: @Mapper(componentModel = "spring")
@Mapper(componentModel = "spring")
public interface CarMapper {
CarDto carToCarDto(Car car);
}
然后其他地方引用時斜筐,可以通過如下方式直接注入使用:
@Autowired
private CarMapper carMapper;
- 對象里面嵌套對象的屬性也是可以指定映射的
@Mapper
public interface FishTankMapperWithDocument {
@Mappings({
@Mapping(target = "fish.kind", source = "fish.type"),
@Mapping(target = "quality.document", source = "quality.report")
})
FishTankWithNestedDocumentDto map( FishTank source );
}
- 當某些屬性名相同時,我們并不想自動映射蛀缝,可以通過ignore來標志, 如下忽略type屬性的映射
@Mapper(componentModel = "spring")
public interface CarMapper {
@Mappings({
@Mapping(source = "manufacturer", target = "make"),
@Mapping(source = "seatCount", target = "numberOfSeats"),
@Mapping(target = "type",ignore = true)
})
void updateCarFromDto(CarDto carDto, @MappingTarget Car car);
}
- Collection也是可以直接映射的
注意點:下面carListToCarDtoList會直接遍歷List, 然后調(diào)用carToCarDto單個完成映射顷链;如果沒有carToCarDto函數(shù)則會自動生成一個,只不過不同屬性的值無法映射
@Mapper(componentModel = "spring")
public interface CarMapper {
@Mappings({
@Mapping(source = "make", target = "manufacturer"),
@Mapping(source = "numberOfSeats", target = "seatCount")
})
CarDto carToCarDto(Car car);
List<CarDto> carListToCarDtoList(List<Car> cars);
}
參考:http://mapstruct.org/documentation/stable/reference/html/