目录
映射对象
package example.model;
import lombok.Data;
@Data
public class Source {
private Integer gender;
}
package example.model;
import lombok.Data;
@Data
public class Target {
private String gender;
}
使用Expression实现简单逻辑转换
MapStruct提供了expression方式实现带有简单逻辑的转换,以下示例代码就实现一个简单的数字到性别的转换
Mapper接口
package example.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import example.model.Source;
import example.model.Target;
@Mapper(componentModel = "spring")
public interface DirectExpressionMapper {
@Mappings({ @Mapping(expression = "java(source.getGender() == 1?\"male\":\"female\")", target = "gender") })
public Target sourceToTarget(Source source);
}
编译生成的实现类
package example.mapper;
import example.model.Source;
import example.model.Target;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-01-29T15:59:12+0800",
comments = "version: 1.5.3.Final, compiler: Eclipse JDT (IDE) 1.4.300.v20221108-0856, environment: Java 17.0.3 (Eclipse Adoptium)"
)
@Component
public class DirectExpressionMapperImpl implements DirectExpressionMapper {
@Override
public Target sourceToTarget(Source source) {
if ( source == null ) {
return null;
}
Target target = new Target();
target.setGender( source.getGender() == 1?"male":"female" );
return target;
}
}
使用Expression实现调用静态方法完成转换
MapStruct提供了expression方式实现静态方法的转换,以下示例代码就实现一个简单的数字到性别的转换
Mapper接口
package example.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import example.model.Source;
import example.model.Target;
@Mapper(componentModel = "spring")
public interface StaticExpressionMapper {
@Mappings({
@Mapping(expression = "java(example.util.GenderConverter.convert(source.getGender()))", target = "gender") })
Target sourceToTarget(Source source);
}
编译生成的实现类
package example.mapper;
import example.model.Source;
import example.model.Target;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-01-29T16:11:13+0800",
comments = "version: 1.5.3.Final, compiler: Eclipse JDT (IDE) 1.4.300.v20221108-0856, environment: Java 17.0.3 (Eclipse Adoptium)"
)
@Component
public class StaticExpressionMapperImpl implements StaticExpressionMapper {
@Override
public Target sourceToTarget(Source source) {
if ( source == null ) {
return null;
}
Target target = new Target();
target.setGender( example.util.GenderConverter.convert(source.getGender()) );
return target;
}
}
优化写法
为了避免Expression变的又臭又长,声明接口时可以这样写
package example.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import example.model.Source;
import example.model.Target;
import example.util.GenderConverter;
@Mapper(componentModel = "spring", imports = { GenderConverter.class })
public interface StaticExpressionMapper {
@Mappings({
@Mapping(expression = "java(GenderConverter.convert(source.getGender()))", target = "gender") })
Target sourceToTarget(Source source);
}
编译结果中的工具类就会以import方式引入
package example.mapper;
import example.model.Source;
import example.model.Target;
import example.util.GenderConverter;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-01-29T16:14:34+0800",
comments = "version: 1.5.3.Final, compiler: Eclipse JDT (IDE) 1.4.300.v20221108-0856, environment: Java 17.0.3 (Eclipse Adoptium)"
)
@Component
public class StaticExpressionMapperImpl implements StaticExpressionMapper {
@Override
public Target sourceToTarget(Source source) {
if ( source == null ) {
return null;
}
Target target = new Target();
target.setGender( GenderConverter.convert(source.getGender()) );
return target;
}
}