MyMapper {
MyDto entityToDto(MyEntity entity);
2.使用expression
属性: 在@Mapping
注解中,你可以使用expression
属性来定义更复杂的映射表达式,包括Java表达式和方法引用。这对于执行特定的映射逻辑非常有用。
@Mapping(target = "fullName", expression = "java(entity.getFirstName() + ' ' + entity.getLastName())")
MyDto entityToDto(MyEntity entity);
3. 映射继承: 如果你有多个映射接口,并且它们具有相似的映射规则,你可以使用@InheritInverseConfiguration
和@InheritConfiguration
来继承映射配置。这减少了代码重复并提高了可维护性。
3.1 @InheritConfiguration: 这个注解用于继承源映射方法的配置,以便将其应用于目标映射方法。这是在目标映射方法上使用的注解。
在源映射方法上定义配置(通常是在源映射接口中)。
使用@InheritConfiguration
注解在目标映射方法上引用源映射方法的配置。
@Mapper
public interface CarMapper {
@InheritConfiguration
CarDto carToCarDto(Car car);
// Other mapping methods
@Mapper
public interface PersonMapper {
@InheritConfiguration
PersonDto personToPersonDto(Person person);
// Other mapping methods
3.2 @InheritInverseConfiguration: 这个注解用于继承目标映射方法的逆向映射配置。逆向映射是指从目标类型到源类型的映射,通常用于更新操作。这是在目标映射方法的逆向映射方法上使用的注解。
在目标映射方法的逆向映射方法上定义配置。
使用@InheritInverseConfiguration
注解在源映射方法上引用逆向映射方法的配置。
@Mapper
public interface CarMapper {
@InheritInverseConfiguration
Car updateCarFromDto(CarDto carDto, @MappingTarget Car car);
// Other mapping methods
@Mapper
public interface PersonMapper {
@InheritInverseConfiguration
Person updatePersonFromDto(PersonDto personDto, @MappingTarget Person person);
// Other mapping methods
4. 条件映射: 使用condition
属性在@Mapping
注解中定义条件,以便仅在满足条件时进行映射。
//编写条件表达式: 在条件属性中,你可以编写一个Java表达式,该表达式应该返回一个布尔值(true或false)。这个表达式通常包括在java()方法中,以便在MapStruct中进行评估。
@Mapping(source = "sourceField", target = "targetField", condition = "java(source.getCondition() == 1)")
TargetDto sourceToTarget(SourceEntity source);
//在上面的示例中,条件表达式检查sourceField的某个属性是否等于1。如果等于1,则条件为//真,映射将执行;否则,映射将被跳过。
//在条件表达式中使用源对象的属性: 你可以在条件表达式中使用源对象的属性,以便根据源//对象的状态或值来决定是否执行映射。
@Mapping(source = "sourceField", target = "targetField", condition = "java(source.getSomeFlag() == true)")
TargetDto sourceToTarget(SourceEntity source);
5. 映射构造函数: MapStruct支持通过构造函数进行映射,可以通过@Mapper
注解的componentModel
属性设置为"spring"
或"cdi"
来启用构造函数映射。这对于将数据直接注入到DTO或实体中非常有用。
6. 后处理映射: 使用@AfterMapping
注解来标记一个方法,该方法会在映射完成后执行,允许你执行额外的处理步骤。
//创建后处理方法: 在同一映射接口中,编写一个方法并用@AfterMapping注解标记它。这个//方法将在映射完成后执行。
@Mapper
public interface MyMapper {
TargetDto sourceToTarget(SourceEntity source);
@AfterMapping
default void afterMapping(SourceEntity source, @MappingTarget TargetDto target) {
// Add custom post-mapping logic here
target.setAge(target.getAge() * 2); // Double the age, for example