Java 对象拷贝与转换-org.mapstruct:mapstruct 包(@Mapper、@Mapping)的使用

这篇具有很好参考价值的文章主要介绍了Java 对象拷贝与转换-org.mapstruct:mapstruct 包(@Mapper、@Mapping)的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MapStruct的使用

最近在学习技术时候,发现一个特别好用的包,org.mapstruct:mapstruct,它是专门用来处理 domin 实体类与 model 类的属性映射的

它的优势:
很多项目大量映射的方式通过手动get、set,首先写法很low,没有技术含量。而且中间还可能牵涉了很多类型转换,嵌套之类的繁琐操作,非常的麻烦。

一、导包

在项目的pom.xml 文件夹中导入包

 <!--mapStruct依赖-->
<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>
     <scope>provided</scope>
</dependency>

如果想要在代码编写的时候有很好的提示的时候,也可以在pom.xml文件中加入相应的插件

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.3.1.Final</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

二、常用注解

org.mapstruct.mapper,Java,spring,java,spring

三、代码使用

案例详解:mapstruct 实体转换及List转换
1、封装接口

package com.geesun.picking.converter;

import com.geesun.picking.domain.MacPickingDetails;
import com.geesun.picking.domain.MacPickingMain;
import com.geesun.picking.domain.MacPrepareDetails;
import com.geesun.picking.domain.MacPrepareMain;
import com.geesun.picking.domain.dto.MacPickingDTO;
import org.mapstruct.Builder;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

/**
 * pojo转换器
 *
 * @author xxx
 * @name ProcessConverter
 * @date 2023-01-05 11:43
 */
@Mapper(componentModel = "spring", builder = @Builder(disableBuilder = true))
public interface PojoConverter {

    PojoConverter INSTANCE = Mappers.getMapper(PojoConverter .class);

    /**
     * 用户实体转换用户DTO对象
     */
    UserDto toUserDto(User data);

}

2、特殊案例

@Mappings({
		@Mapping(source = "cityId", target = "cityIds"),
        @Mapping(target = "groupIds", expression = "java(com.alibaba.fastjson.JSONObject.parseObject(source.getUserGroupIds(), new com.alibaba.fastjson.TypeReference<java.util.List<java.lang.Long>>() {}))"),
        @Mapping(target = "status", ignore = true)
})
Context templateDto2Context(TemplateDto source);

(1) 类型不一致

@Mappings({
	@Mapping(target = "createTime", expression = "java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"),
})
UserVO3 toConvertVO3(User source);

(2) 字段名不一致

@Mappings({
	@Mapping(source = "id", target = "userId"),
    @Mapping(source = "name", target = "userName")
})
UserVO4 toConvertVO(User source);

(3) 忽略字段

@Mappings({
        @Mapping(target = "status", ignore = true)
})
Context templateDto2Context(TemplateDto source);

(4)执行报错

报错案例:Unknown property “xxx” in result type xxx. Did you mean “null”?

代码生成器annotationProcessor标签部分,将lombok放在mapstruct之前

    <build>
        <plugins>
            <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>
                    <encoding>UTF-8</encoding>
                    <!--自动生成代码annotationProcessor-->
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

参考链接:Mapstruct使用时报Unknown property xxx in result type xxx. Did you mean null?

3、mapstruct禁用构建器@Bulder
参考文档:https://blog.csdn.net/lhc66666/article/details/123654325

在转换类上添加注解:@Mapper(builder = @Builder(disableBuilder = true))文章来源地址https://www.toymoban.com/news/detail-621657.html

到了这里,关于Java 对象拷贝与转换-org.mapstruct:mapstruct 包(@Mapper、@Mapping)的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java对象深拷贝详解(List深拷贝)

    在Java语言中,拷贝一个对象时,有浅拷贝与深拷贝两种 浅拷贝:只拷贝源对象的地址,所以新对象与老对象 共用 一个地址,当该地址变化时,两个对象也会随之改变。 深拷贝:拷贝对象的所有值,即使源对象发生任何改变,拷贝的值也不会变化。 在User类的基础上,介绍两

    2024年02月02日
    浏览(41)
  • 【Java基础】2.对象拷贝

    深拷贝: =创建一个新对象,然后将当前对象的非静态字段复制到该新对象。 ==无论该字段是基本类型的还是引用类型,都复制独立的一份。当你修改其中一个对象的任何内容时,都不会影响另一个对象的内容。 浅拷贝: =创建一个新对象,然后将当前对象的非静态字段复制

    2024年02月15日
    浏览(34)
  • Java如何使用XMLBeans实现XML和Java对象的相互转换

    原文和更多内容: Java如何使用XMLBeans实现XML和Java对象的相互转换 (techdatafuture.com) 要使用XMLBeans实现XML和Java对象的相互转换,可以按照以下步骤进行操作: 1. 添加XMLBeans Maven依赖: dependency     groupIdorg.apache.xmlbeans/groupId     artifactIdxmlbeans/artifactId     version3.1.0/version /depen

    2024年02月16日
    浏览(50)
  • java中list对象拷贝至新的list对象并保持两个对象独立的方法

    使用构造函数: 可以使用List的构造函数,传递原始List作为参数来创建一个新的List对象。这样做会创建一个新的List对象,两个List对象互相独立,修改其中一个不会影响另一个。 使用addAll()方法: 可以使用List的addAll()方法将原始List中的所有元素添加到一个新的List中。 使用

    2024年02月07日
    浏览(46)
  • Elasticsearch exception [type=mapper_parsing_exception, reason=Failed to parse mapping [properties]

    Elasticsearch exception [type=mapper_parsing_exception, reason=Failed to parse mapping [properties]: Root mapping definition has unsupported parameters:   我们在使用RestClient创建索引库时出现了这个错误。 可以检查一下 CreateIndexRequest 类型变量request 是否导入正确的包 有两个同名的包,我们选择: 创建的索引

    2024年02月11日
    浏览(42)
  • ElasticSearch创建索引报错:mapper_parsing_exception Root mapping definition has unsupported parameters

    ElasticSearch版本号:5.6.14,这个错误和ES版本有一定的关系,还是先交代下版本号,免得有的读者根据我的方法操作后无效 错误翻译: mapper_parsing_exception :映射解析异常 Root mapping definition has unsupported parameters :根映射定义包含不受支持的参数 错误映射语句1: 错误映射语句

    2024年02月11日
    浏览(53)
  • java 对象list使用stream根据某一个属性转换成map的几种方式

    可以使用Java 8中的Stream API将List转换为Map,并根据某个属性作为键或值。以下是一些示例代码: 在这个示例中,将Person对象列表转换为Map,其中键为Person对象的name属性,值为Person对象本身。 在这个示例中,将Person对象列表转换为Map,其中键为Person对象本身,值为Person对象的

    2024年02月13日
    浏览(62)
  • elasticsearch创建索引报[type=mapper_parsing_exception, reason=Failed to parse mapping [_doc]......

    小伙伴们,你们好,我是老寇 经过反复排查,发现是安装的pinyin和ik分词版本不对,只需要修改成与es版本一致即可 es 7.6.2 举例 1.在windows界面用压缩软件打开elasticsearch-analysis-ik-7.6.2.jar 2.将pom.xml拖出到桌面 3.修改版本 4.将pom.xml放回压缩包( 原路放回 ) 5. elasticsearch-analysis

    2024年02月13日
    浏览(32)
  • vue对象复制(使用es6对象扩展运算符,深拷贝)

    vue3+es6语法 直接上代码

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包