返回顶部
首页 > 资讯 > 后端开发 > Python >MapStruct表达式应用及避坑详解
  • 703
分享到

MapStruct表达式应用及避坑详解

2024-04-02 19:04:59 703人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言遇到的问题发现原因结语前言 生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解。MapStruct的表达式功能是为了处理特殊对象属性的映射问题,比如DTO中的s

前言

生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解。MapStruct的表达式功能是为了处理特殊对象属性的映射问题,比如DTO中的status属性转换成PO中的status需要进一步的处理,这个时候就需要用到表达式功能了。这里不再赘述关于MapStruct的使用问题,更多的使用教程可参考文档

MapStruct官方文档:https://mapstruct.org/documentation/stable/reference/html/#mapping-composition

遇到的问题

先看一段映射的代码:

@Mapper(imports = CustomProcessors.class)
public interface DepartmentsMapper {
    @Mapping(target = "status", expression = "java( DepartmentsMapper.toStatus(department.getStatus()) )")
    DepartmentsVO boToVo(DepartmentBO department);
    static String toStatus(String status){
        return status + "状态";
    }
}

原本这段代码表达的语义是:将DepartmentBO的status属性赋值给DepartmentsVO时,需要进行一些简单的转换,转换的方法就是Mapper接口里定义的toStatus静态方法。可最终MapStruct生成的代码把其他属性的赋值动作也做了处理。生成的代码如下:

可以看到除了指定的status属性加上了表达式中的代码,其他的属性也都加上了,这不是我们想要的效果。

发现原因

楼主反复查看官方文档,最后就差把源码拉下来看实现逻辑了,最后一个闪念猜想到了可能的原因。上面关于表达式的使用代码没有问题,官方文档也写的很清楚。主要是因为这里触发了MapStruct的一个隐藏功能:仔细观察生成的代码发现,只有Integer属性的字段加上表达式中的代码了,楼主推断只要在定义maping的接口中定义了转换方法就会被自动应用到相同类型属性的转换上。后面验证确实如此,比如我去掉表达式的定义:

@Mapper(imports = CustomProcessors.class)
public interface DepartmentsMapper {
    DepartmentsVO boToVo(DepartmentBO department);
    static Integer toStatus(Integer status){
        return status + 1;
    }
}

最终生成的代码还是所有的Integer属性的值都加上了toStatus的处理了

结语

最后发现的这个特性竟然在官方文档上找不到丝毫的描述,其实可以算一个非常不错的功能,可以统一处理相同类型的属性,比如属性是一个对象时,只是在博主的这个场景下使用不到。最后的解决方案是将表达式中的代码定义从Mapper接口中移出去就好了。

以上就是MapStruct表达式应用及避坑详解的详细内容,更多关于MapStruct表达式避坑的资料请关注编程网其它相关文章!

--结束END--

本文标题: MapStruct表达式应用及避坑详解

本文链接: https://lsjlt.com/news/140083.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MapStruct表达式应用及避坑详解
    目录前言遇到的问题发现原因结语前言 生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解。MapStruct的表达式功能是为了处理特殊对象属性的映射问题,比如DTO中的s...
    99+
    2024-04-02
  • 基于springEL表达式详解及应用
    目录基于springEL表达式详解及应用什么是SpringEL?为什么要使用SpringEL?如何使用SpringEL?使用SpringEL注入简单值使用SpringEL调用方法Sp...
    99+
    2024-04-02
  • Java中Lambda表达式使用及详解
    Java中Lambda表达式使用及详解 前言 一、Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加...
    99+
    2023-08-16
    java
  • Python正则表达式的应用详解
    目录正则表达式的定义Python对正则表达式的支持示例例1:验证输入的用户名是否有效,用户名由长度为6到20的字母、数字、下划线组成例2:从字符串中找到与正则表达式匹配的部分例3:从...
    99+
    2024-04-02
  • C++ 正则表达式的应用详解
    目录一、为什么要学正则表达式C++string处理:二、正则程序库(regex)正则文法:正则库:匹配(Match)搜索(Search)替换(Replace)一、为什么要学正则表达式...
    99+
    2024-04-02
  • C# LINQ查询表达式及对应LAMBDA表达式的用法
    目录首先先让我们看一下什么是LINQ查询表达式和Lambda表达式:什么是“延迟执行”?还是上面例子中的查询:并行linqC#编程语言非常优美,我个人还是非常赞同的。特别是在学习一段...
    99+
    2024-04-02
  • Javascript中正则表达式的应用详解
    目录stringsearchreplacematch:RegExp总结正则表达式 在前端中的应用也是比较常见的,我们在有时候也需要 用js 对某些字符串进行查找\捕获 或者 替换. ...
    99+
    2024-04-02
  • Python中使用正则表达式及正则表达式匹配规则详解
    目录1 导库2 使用模板3 说明4 示例5 正则表达式匹配规则1 导库 import re 2 使用模板 re_pattern = re.compile(pattern, flags...
    99+
    2023-03-22
    Python正则表达式匹配规则 Python正则表达式
  • Lambda表达式详解
    Lambda表达式 1. 为什么使用lambda表达式2. 入门案例3. lambda表达式组成4. lambda表达式使用4.1 语法格式一4.2 语法格式二4.3 语法格式三4.4 语法格...
    99+
    2023-09-01
    java jvm 算法
  • JavaLambda表达式详解
    Java Lambda表达式是JDK8引入的,是一个比较重要的特性 Lambda表达式简介 Lambda 表达式是 JDK8 的一个新特性,也被称为闭包,Lambda表达式允许把函数...
    99+
    2023-02-18
    Java Lambda表达式详解 Java Lambda表达式创建线程 Java Lambda表达式的语法 Java lambda遍历List集合 Java lambda过滤String
  • 正则表达式用法详解
    正则表达式之基本概念 在我们写页面时,往往需要对表单的数据比如账号、身份证号等进行验证,而最有效的、用的最多的便是使用正则表达式来验证。那什么是正则表达式呢? 正则表达式(Regul...
    99+
    2024-04-02
  • JavaScript中正则表达式的实际应用详解
    实际工作中,JavaScript正则表达式还是经常用到的。所以这部分的知识是非常重要的。 一、基础语法: 第一种:字面量语法 var expression=/pattern/f...
    99+
    2024-04-02
  • idea 正则表达式搜索替换应用详解
    idea 正则表达式搜索替换简单应用 利用正则表达式,idea可以进行快速大量替换  1.CTRL+R 快捷键调出下面当前页面替代操作栏 注意要使用正则表达式替换需要勾选...
    99+
    2024-04-02
  • python3 lambda表达式详解
    技术背景 lambda表达式本身是一个非常基础的python函数语法,其基本功能跟使用def所定义的python函数是一样的,只是lambda表达式基本在一行以内就完整的表达了整个函数的运算逻辑。这里我们简单展示一些...
    99+
    2022-06-02
    python的lambda函数 python中lambda的用法 python lambda函数怎么用
  • 详解SqlServer 表达式(expression)
    2   具体内容  2.1  使用范围 SQL Server(2008开始) ;Azure SQL数据库;Azure  SQL数据仓库;并行数据仓库 2.2...
    99+
    2024-04-02
  • java lambda表达式详解
    一、Lambda初识 我们知道,在Java中,接口是不能实例化的,但是接口对象可以指向它的实现类对象。如果接口连实现对象都没有呢?那还可以使用匿名类的方式,如下: public class JavaTest { public ...
    99+
    2023-09-15
    java servlet jvm
  • C++Lambda表达式详解
    目录概述语法分析捕获列表关键字声明示例捕获列表按值传递总结概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下: ...
    99+
    2024-04-02
  • java开发使用StringUtils.split避坑详解
    目录正文StringUtils.split 的坑StringUtils.split 源码分析如何解决?正文 在日常的 Java 开发中,由于 JDK 未能提供足够的常用的操作类库,...
    99+
    2022-11-13
    java开发StringUtils.split避坑 java StringUtils split
  • ReactuseState的错误用法避坑详解
    目录引言冗余的 state简单示例问题分析解决方案重复的 state简单示例问题分析解决方案使用 useEffect 更新 state简单示例问题分析解决方案使用 useEffect...
    99+
    2023-01-12
    React useState错误避坑 React useState
  • 正则表达式grep用法详解
    grep是一个强大的文本搜索工具,它使用正则表达式来搜索和匹配文本。下面是grep的一些常用用法详解:1. 基本用法:grep pattern file这个命令会在文件中搜索匹配指定模式的行,并将其打印出来。pattern是一个正则表达...
    99+
    2023-08-11
    正则表达式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作