java 中mapstruct实现类相互转换

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注解处理器来绑定mapstructlombok.

 <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>

猜你喜欢

转载自blog.csdn.net/qq_37778018/article/details/122606987