MapStruct使用,代码生成不全问题

417 阅读1分钟

MAVEN

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.32</version>
</dependency>

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.6.0</version>
</dependency>
<!--    对象映射组件 -->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
    <version>1.6.0</version>
</dependency>
<!--    对象映射处理器    -->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.6.0</version>
</dependency>

编写转换类

package com.beite.beiteblog.admin.convertor;

import com.beite.beiteblog.admin.dto.ResourceAddDTO;
import com.beite.beiteblog.admin.dto.ResourceDTO;
import com.beite.beiteblog.admin.dto.ResourceUpdateDTO;
import com.beite.beiteblog.admin.entity.ResourceEntity;
import com.beite.beiteblog.common.utils.PageUtils;
import org.mapstruct.Builder;
import org.mapstruct.Mapper;

import java.util.List;

/**
 * 功能资源路径转换器
 * @author beite_he[beite_he@insightfo.cn]
 * @author <a href="mailto:beite_he@insightfo.cn">Beite</a>
 * @version 1.0
 * @date 2022年01月07日 11:19
 */
@Mapper(componentModel = "spring", builder = @Builder)
public interface ResourceConverter {
    //dataobject转成DTO
    ResourceDTO doToDto(ResourceEntity resourceEntity);

    //DTO转成dataobject
    ResourceEntity dtoToDo(ResourceDTO resourceDTO);

    //ADDDTO转成dataobject
    ResourceEntity addDtoToDo(ResourceAddDTO resource);

    //UPDATEDTO转成dataobject
    ResourceEntity updateDtoToDo(ResourceUpdateDTO resource);

    //dataobject list转成DTO list
    List<ResourceDTO> doListToDtoList(List<ResourceEntity> resourceEntity);

    //DTO list转成dataobject list
    List<ResourceEntity> dtoListToDoList(List<ResourceDTO> resourceDTO);

    ////dataobject page转成DTO page
    PageUtils<ResourceDTO> doToDto(PageUtils<ResourceEntity> resourceEntity);

    ////DTO page转成dataobject page
    PageUtils<ResourceEntity> dtoToDo(PageUtils<ResourceDTO> resourceDTO);


}

代码生成不全问题

这个问题我踩了半天坑,一开始一直纠结的是idea中有个注解处理器设置,但是设置了半天没用

解决方法

查看target\generated-sources\annotations下生成的类,发现只创建了一个空对象,没有生成任何set代码。 这里用到了lombok 排查发现,maven引用的时候先引用的mapstruct后lombok,导致mapstruct构建set code的时候,对象的get set方法还没有被lombok生成,导致此问题。 解决办法: 先引用lombok,后mapstruct 或者maven plugin 指定编译顺序。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version> <!-- 确保使用支持 JDK 21 的版本 -->
    <configuration>
        <source>21</source>
        <target>21</target>
        <annotationProcessorPaths>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.32</version>
            </path>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>1.6.0</version>
            </path>
        </annotationProcessorPaths>
    </configuration>

</plugin>