当前位置: 代码网 > it编程>编程语言>Java > SpringBoot3集成MapstructPlus的实现

SpringBoot3集成MapstructPlus的实现

2025年08月11日 Java 我要评论
mapstruct plus 是 mapstruct 的增强工具,在 mapstruct 的基础上,实现了自动生成 mapper 接口的功能,并强化了部分功能,使 java 类型转换更加便捷、优雅。

mapstruct plus 是 mapstruct 的增强工具,在 mapstruct 的基础上,实现了自动生成 mapper 接口的功能,并强化了部分功能,使 java 类型转换更加便捷、优雅。 www.mapstruct.plus/

引入依赖

pom.xml

<properties>
    <java.version>21</java.version>
    <project.build.sourceencoding>utf-8</project.build.sourceencoding>
    <!-- 插件版本 -->
    <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
    <lombok.version>1.18.38</lombok.version>
	<mapstruct-plus.version>1.4.8</mapstruct-plus.version>
    <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
</properties>

<dependencymanagement>
  <dependencies>
      <!-- mapstructplus 依赖
           https://mvnrepository.com/artifact/io.github.linpeilie/mapstruct-plus-spring-boot-starter
      -->
      <dependency>
          <groupid>io.github.linpeilie</groupid>
          <artifactid>mapstruct-plus-spring-boot-starter</artifactid>
          <version>${mapstruct-plus.version}</version>
      </dependency>
      
    </dependencies>
</dependencymanagement>

<build>
    <plugins>
        <!-- maven 编译插件 -->
        <plugin>
            <groupid>org.apache.maven.plugins</groupid>
            <artifactid>maven-compiler-plugin</artifactid>
            <version>${maven-compiler-plugin.version}</version>
            <configuration>
                <source>${java.version}</source>    <!-- 源代码使用的jdk版本 -->
                <target>${java.version}</target>    <!-- 需要生成的目标class文件的编译版本 -->
                <encoding>${project.build.sourceencoding}</encoding> <!-- 字符集编码,防止中文乱码 -->
                <compilerargs>
                    <arg>-parameters</arg>  <!-- 保留方法参数名称 -->
                </compilerargs>

                <annotationprocessorpaths>
                    <path>
                        <groupid>io.github.linpeilie</groupid>
                        <artifactid>mapstruct-plus-processor</artifactid> <!-- 定义了一个注解处理器的依赖项, 必须手动配置到此处,才能在编译阶段生成具体的映射实现类,避免运行时的性能开销 -->
                        <version>${mapstruct-plus.version}</version>
                    </path>
                    <!-- 依赖地址:https://mvnrepository.com/artifact/org.projectlombok/lombok-mapstruct-binding
                             解决 lombok 与 mapstruct 的编译顺序冲突
                             强制 lombok 在 mapstruct 处理完映射代码后再运行,从而避免字段缺失或无法识别的问题
                             官网提示:https://mapstruct.org/documentation/stable/reference/html/#lombok
                        -->
                    <path>
                        <groupid>org.projectlombok</groupid>
                        <artifactid>lombok-mapstruct-binding</artifactid>
                        <version>${lombok-mapstruct-binding.version}</version>
                    </path>
                    <!--
                        一旦你使用了 <annotationprocessorpaths>,maven 将只使用你指定的处理器,默认的 lombok 注解处理器不会自动加入。
                        所以此处需显式添加 lombok 注解处理器 依赖
                        -->
                    <path>
                        <groupid>org.projectlombok</groupid>
                        <artifactid>lombok</artifactid>
                        <version>${lombok.version}</version>
                    </path>
                </annotationprocessorpaths>
            </configuration>
        </plugin>
    </plugins>
</build>

封装工具类

公共模块pom.xml

<dependencies>
	<!-- 包含:springutils -->
    <dependency>
        <groupid>cn.hutool</groupid>
        <artifactid>hutool-extra</artifactid>
    </dependency>
    <!-- mapstruct-plus映射工具类 -->
    <dependency>
        <groupid>io.github.linpeilie</groupid>
        <artifactid>mapstruct-plus-spring-boot-starter</artifactid>
    </dependency>
</dependencies>

工具类mapstructutils.java

package com.zibocoder.plugins.common.util;

import cn.hutool.core.collection.collutil;
import cn.hutool.core.map.maputil;
import cn.hutool.core.util.objectutil;
import cn.hutool.extra.spring.springutil;
import io.github.linpeilie.converter;
import lombok.accesslevel;
import lombok.noargsconstructor;

import java.util.list;
import java.util.map;

/**
 * @author zibocoder
 * @date 2025/7/19 17:34:58
 * @description mapstruct工具类
 */
@noargsconstructor(access = accesslevel.private) // 自动生成一个私有的无参构造方法(禁止实例化:构造函数是私有的,意味着这个类 不能从外部被实例化)
public class mapstructutils {
    private final static converter converter = springutil.getbean(converter.class);

    /**
     * 将 t 类型对象,转换为 desc 类型的对象并返回
     *
     * @param source 数据来源实体
     * @param desc   描述对象 转换后的对象
     * @return desc
     */
    public static <t, v> v convert(t source, class<v> desc) {
        if (objectutil.isnull(source)) {
            return null;
        }
        if (objectutil.isnull(desc)) {
            return null;
        }
        return converter.convert(source, desc);
    }

    /**
     * 将 t 类型对象,按照配置的映射字段规则,给 desc 类型的对象赋值并返回 desc 对象
     *
     * @param source 数据来源实体
     * @param desc   转换后的对象
     * @return desc
     */
    public static <t, v> v convert(t source, v desc) {
        if (objectutil.isnull(source)) {
            return null;
        }
        if (objectutil.isnull(desc)) {
            return null;
        }
        return converter.convert(source, desc);
    }

    /**
     * 将 t 类型的集合,转换为 desc 类型的集合并返回
     *
     * @param sourcelist 数据来源实体列表
     * @param desc       描述对象 转换后的对象
     * @return desc
     */
    public static <t, v> list<v> convert(list<t> sourcelist, class<v> desc) {
        if (objectutil.isnull(sourcelist)) {
            return null;
        }
        if (collutil.isempty(sourcelist)) {
            return collutil.newarraylist();
        }
        return converter.convert(sourcelist, desc);
    }

    /**
     * 将 map 转换为 beanclass 类型的集合并返回
     *
     * @param map       数据来源
     * @param beanclass bean类
     * @return bean对象
     */
    public static <t> t convert(map<string, object> map, class<t> beanclass) {
        if (maputil.isempty(map)) {
            return null;
        }
        if (objectutil.isnull(beanclass)) {
            return null;
        }
        return converter.convert(map, beanclass);
    }
}

实际应用

deptaddform->deptentity deptaddform.java

package com.zibocoder.system.domain.form;

import com.zibocoder.system.domain.entity.deptentity;
import io.github.linpeilie.annotations.automapper;
import jakarta.validation.constraints.notblank;
import jakarta.validation.constraints.notnull;
import lombok.data;
import org.hibernate.validator.constraints.length;

/**
 * @author zibocoder
 * @date 2025/7/13 06:54:08
 * @description 部门添加表单
 */
@data
@automapper(target = deptentity.class, reverseconvertgenerate = false) //自动映射当前类与 deptentity.class 之间的字段对应关系,reverseconvertgenerate = false 表示不生成反向转换方法。
public class deptaddform {
    /**
     * 部门名称
     */
    @notblank(message = "部门名称不能为空")
    @length(min = 1, max = 30, message = "部门名称长度不能超过{max}个字符")
    private string deptname;
    /**
     * 父部门id
     */
    @notnull(message = "父部门id不能为空")
    private long parentid;
    /**
     * 排序
     */
    @notnull(message = "显示顺序不能为空")
    private integer thesort;
    /**
     * 备注
     */
    private string remark;
}

deptentity.java

package com.zibocoder.system.domain.entity;

import com.baomidou.mybatisplus.annotation.idtype;
import com.baomidou.mybatisplus.annotation.tableid;
import com.baomidou.mybatisplus.annotation.tablename;
import lombok.data;

/**
 * @author zibocoder
 * @date 2025/7/10 08:16:20
 * @description 部门实体对象
 */
@data
@tablename(value = "sys_dept", autoresultmap = true)
public class deptentity {
    /**
     * 部门id
     */
    @tableid(type = idtype.auto)
    private long deptid;
    /**
     * 部门名称
     */
    private string deptname;
    /**
     * 父部门id
     */
    private long parentid;
    /**
     * 祖级列表
     */
    private string ancestors;
    /**
     * 排序
     */
    private string thesort;
    /**
     * 部门状态:是否被禁用 false-0否 true-1是
     */
    private boolean disabledflag;
    /**
     * 备注
     */
    private string remark;
}

业务类 deptservice.java

/**
 * 新增部门
 * @param deptaddform 部门新增表单
 * @return 响应结果
 */
public responseresult<void> adddept(deptaddform deptaddform) {
    ...
    deptentity deptentity = mapstructutils.convert(deptaddform, deptentity.class);
    ...
    deptmapper.insert(deptentity);
    return responseresult.ok();
}

到此这篇关于springboot3集成mapstructplus的实现的文章就介绍到这了,更多相关springboot3 mapstructplus内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com