1.导入依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</dependency>
2.写转换mapper类,这里的mapper不是mybatis的mapper,而是mapstruct的mapper。
//2.3 自定义日期属性引入
@Mapper(uses=DateMapper.class)
public interface UserCovert {
UserCovert INSTANCE = Mappers.getMapper(UserCovert.class);
/**
* 2.1 mapstruct 实体转实体
* 如果转换后属性都为null,可在方法上加上@Mappings({@Mapping(source="userId",target="userId"),@Mapping(source="userName",target="userName")}),或@Mappings({})
* UserVo转UserDto
* @param userVo
* @return
*/
UserDto toDtoUser(UserVo userVo);
/**
* 2.2 mapstruct 集合转集合
* 如果转换后属性都为null,说明没有单一的转换方法
* 解决方案:
* (1). 在方法上加上@Mappings({}),该注解自动生成单个对象的转换方法。
* (2). 写一个单个对象转换的方法,当调用到这个方法的时候会去自动调用该集合的单个对象转换方法。
* 例如:List<UserDto2>集合返回的对象是UserDto2
* 所以写一个返回对象为UserDto2的方法UserDto2 toDtoUser(UserVo userVo);
* List<UserVo> 集合转
* List<UserDto> 集合
* @param userVos
* @return
*/
List<UserDto> toDtoUsers(List<UserVo> userVos);
}
2.3 @Mapper(uses=DateMapper.class)中自定义的日期属性类DateMapper
public class DateMapper {
public String asString(Date date) {
return date != null ? new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date) : null;
}
public Date asDate(String date) {
try {
return date != null ? new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date) : null;
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
3. 使用
3.1 对象转对象
UserVo userVo = userCarMapper.getUserVo(userCarId);
UserDto userDto = UserCarCovert.INSTANCE.toDtoUser(userVo);
3.2 集合转集合
List<UserVo> userVos = userCarMapper.getUserVos(userId);
List<UserDto> userDtos = UserCarCovert.INSTANCE.toDtoUsers(userVos);
idea启动报错,java: Internal error in the mapping processor: java.lang.NullPointerException at org.ma...
解决方案:
1.设置File→settings→Compiler的User-local build process VM options (overrides Shared options)选项设置-Djps.track.ap.dependencies=false,选择apply
2.在pom.xml里面修改mapstruct-processor的版本,升级至1.4.1.Final或者更高版本
mapstruct 和lombok 结合之后mapstruct生成空实现的解决办法
如果出现mapstruct和lombok配合生成的bean实现类中是空实现,没有对生成bean进行setter赋值.那么就需要在maven-compiler-plugin
插件下多配置一个lombok-mapstruct-binding
注解处理器来绑定mapstruct
和lombok
.
<properties>
<java.version>1.8</java.version>
<org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<!-- 如果是0.1.0 有可能出现生成了maptruct的实现类,但该类只创建了对象,没有进行赋值 -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>