Mapstruct自定义转换规则

简介: Mapstruct自定义转换规则

一、定义转换规则

定义的类上边增加@Named注解标注转换名称

定义转换规则

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import org.mapstruct.Named;
import org.springframework.stereotype.Component;
 
import java.util.List;
import java.util.Objects;
 
/**
 * Mapping通用转换
 */
@Component
public class TypeConversionWorker {
    /**
     * 对象转json字符串
     *
     * @param obj
     * @return
     */
    @Named("toJsonString")
    public String toJsonString(Object obj) {
        if (Objects.isNull(obj)) {
            return null;
        }
        return JSON.toJSONString(obj);
    }
    /**
     * json字符串转对象
     *
     * @param jsonStr
     * @return
     */
    @Named("jsonStringToNameObject")
    public List<Name> jsonStringToObject(String jsonStr) {
        if (StrUtil.isEmpty(jsonStr)) {
            return null;
        }
        List<Name> names = JSON.parseArray(jsonStr, Name.class);
        return names;
    }
    /**
     * json字符串转对象
     *
     * @param jsonStr
     * @return
     */
    @Named("jsonStringToNameValueObject")
    public List<NameValue> jsonStringToNameValueObject(String jsonStr) {
        if (StrUtil.isEmpty(jsonStr)) {
            return null;
        }
        List<NameValue> names = JSON.parseArray(jsonStr, NameValue.class);
        return names;
    }
    /**
     * json字符串转对象
     *
     * @param jsonStr
     * @return
     */
    @Named("jsonStringToValueObject")
    public List<Value> jsonStringToValueObject(String jsonStr) {
        if (StrUtil.isEmpty(jsonStr)) {
            return null;
        }
        List<Value> names = JSON.parseArray(jsonStr, Value.class);
        return names;
    }
}

二、使用转换规则

使用@Mapper注解uses引入转换规则,eg:uses = TypeConversionWorker.class

@Mapping使用qualifiedByName标识转换规则,eg:qualifiedByName = "toJsonString"。

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
 
import java.util.List;
 
@Mapper(uses = TypeConversionWorker.class)
public interface ShopConvert {
 
    ShopConvert INSTANCE = Mappers.getMapper(ShopConvert.class);
    @Mapping(target = "serviceField", source = "serviceField", qualifiedByName = "jsonStringToNameObject")
    @Mapping(target = "costField", source = "costField", qualifiedByName = "jsonStringToNameValueObject")
    @Mapping(target = "examinationField", source = "examinationField", qualifiedByName = "jsonStringToValueObject")
    List<ShopRespVO> convertList(List<ShopDO> list);
 
    List<ShopSimpleRespVO> convertList02(List<ShopDO> list);
 
    @Mapping(target = "serviceField", source = "serviceField", qualifiedByName = "jsonStringToNameObject")
    @Mapping(target = "costField", source = "costField", qualifiedByName = "jsonStringToNameValueObject")
    @Mapping(target = "examinationField", source = "examinationField", qualifiedByName = "jsonStringToValueObject")
    ShopRespVO convert(ShopDO bean);
 
    @Mapping(target = "serviceField", source = "serviceField", qualifiedByName = "toJsonString")
    @Mapping(target = "costField", source = "costField", qualifiedByName = "toJsonString")
    @Mapping(target = "examinationField", source = "examinationField", qualifiedByName = "toJsonString")
    ShopDO convert(ShopCreateReqVO bean);
 
    @Mapping(target = "serviceField", source = "serviceField", qualifiedByName = "toJsonString")
    @Mapping(target = "costField", source = "costField", qualifiedByName = "toJsonString")
    @Mapping(target = "examinationField", source = "examinationField", qualifiedByName = "toJsonString")
    ShopDO convert(ShopUpdateReqVO bean);
 
 
}

涉及到实体(非重点)

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
 
import java.util.Date;
import java.util.List;
 
@ApiModel("管理后台 - 商品信息 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class ShopRespVO extends ShopBaseVO {
 
    @ApiModelProperty(value = "商品编号", required = true, example = "1024")
    private Long id;
 
 
    @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
    private Date createTime;
 
    /*分类名称*/
    private String systemClassificationName;
 
    /*前端回填ID*/
    private List<Long> ids;
 
}
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
 
import java.math.BigDecimal;
import java.util.List;
 
/**
 * 商品 Base VO,提供给添加、修改、详细的子 VO 使用
 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
 */
@Data
public class ShopBaseVO {
 
    /**
     * 商品名称
     */
    @ApiModelProperty("商品名称")
    @Length(max= 255,message="编码长度不能超过255")
    private String name;
    /**
     * 商品分类
     */
    @ApiModelProperty("商品分类")
    private Long systemClassificationId;
    /**
     * 标准价格
     */
    @ApiModelProperty("标准价格")
    private BigDecimal price;
    /**
     * 最低价格
     */
    @ApiModelProperty("最低价格")
    private BigDecimal minPrice;
    /**
     * 商品状态(0正常 1停用)
     */
    @ApiModelProperty("商品状态(0正常 1停用)")
    private Byte status;
    /**
     * 服务字段
     */
    @ApiModelProperty("服务字段")
    private List<Name> serviceField;
    /**
     * 成本费用标准
     */
    @ApiModelProperty("成本费用标准")
    private List<NameValue> costField;
    /**
     * 补充报考字段
     */
    @ApiModelProperty("补充报考字段")
    private List<Value> examinationField;
    /**
     * 备注
     */
    @ApiModelProperty("备注")
    @Length(max= 255,message="备注长度不能超过255")
    private String remark;
}
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Length;
 
import java.math.BigDecimal;
import java.util.Date;
 
/**
* 商品
* @TableName system_shop
*/
@TableName("system_shop")
@Data
@EqualsAndHashCode(callSuper = true)
public class ShopDO extends TenantBaseDO {
 
    /**
    * 商品ID
    */
    @ApiModelProperty("商品ID")
    private Long id;
    /**
    * 商品名称
    */
    @ApiModelProperty("商品名称")
    @Length(max= 255,message="编码长度不能超过255")
    private String name;
    /**
    * 商品分类
    */
    @ApiModelProperty("商品分类")
    private Long systemClassificationId;
    /**
    * 标准价格
    */
    @ApiModelProperty("标准价格")
    private BigDecimal price;
    /**
    * 最低价格
    */
    @ApiModelProperty("最低价格")
    private BigDecimal minPrice;
    /**
    * 商品状态(0正常 1停用)
    */
    @ApiModelProperty("商品状态(0正常 1停用)")
    private Byte status;
    /**
    * 服务字段
    */
    @ApiModelProperty("服务字段")
    private String serviceField;
    /**
    * 成本费用标准
    */
    @ApiModelProperty("成本费用标准")
    private String costField;
    /**
    * 补充报考字段
    */
    @ApiModelProperty("补充报考字段")
    private String examinationField;
    /**
    * 创建者
    */
    @ApiModelProperty("创建者")
    @Length(max= 64,message="编码长度不能超过64")
    private String creator;
    /**
    * 创建时间
    */
    @ApiModelProperty("创建时间")
    private Date createTime;
    /**
    * 更新者
    */
    @ApiModelProperty("更新者")
    @Length(max= 64,message="编码长度不能超过64")
    private String updater;
    /**
    * 更新时间
    */
    @ApiModelProperty("更新时间")
    private Date updateTime;
    /**
    * 是否删除
    */
    @ApiModelProperty("是否删除")
    private Boolean deleted;
    /**
    * 租户编号
    */
    @ApiModelProperty("租户编号")
    private Long tenantId;
    /**
    * 备注
    */
    @ApiModelProperty("备注")
    @Length(max= 255,message="编码长度不能超过255")
    private String remark;
 
 
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
 
import javax.validation.constraints.NotNull;
 
@ApiModel("管理后台 - 商品更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class ShopUpdateReqVO extends ShopBaseVO {
 
    @ApiModelProperty(value = "商品编号", required = true, example = "1024")
    @NotNull(message = "商品编号不能为空")
    private Long id;
 
 
}
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
 
@ApiModel("管理后台 - 商品创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ShopCreateReqVO extends ShopBaseVO {
}

相关文章
最新jsonwebtoken-jjwt 0.12.3 基本使用
最新jsonwebtoken-jjwt 0.12.3 基本使用
4603 1
|
安全 IDE Java
MapStruct - 原理讲解
MapStruct - 原理讲解
1811 2
MapStruct - 原理讲解
|
8月前
|
Apache
Excel工具-HUTOOL-读取Excel
基于Hutool和Apache POI,封装Excel读取工具,支持xls/xlsx格式。可读取为List、Map或Bean,提供Sax模式(Excel03SaxReader/Excel07SaxReader)高效处理大文件,避免内存溢出,适用于海量数据流式读取。
|
安全 Java Maven
MapStruct使用教程2024(高级版)
MapStruct使用教程2024(高级版)
|
前端开发 Java C++
RSocket vs WebSocket:Spring Boot 3.3 中的两大实时通信利器
本文介绍了在 Spring Boot 3.3 中使用 RSocket 和 WebSocket 实现实时通信的方法。RSocket 是一种高效的网络通信协议,支持多种通信模式,适用于微服务和流式数据传输。WebSocket 则是一种标准协议,支持全双工通信,适合实时数据更新场景。文章通过一个完整的示例,展示了如何配置项目、实现前后端交互和消息传递,并提供了详细的代码示例。通过这些技术,可以大幅提升系统的响应速度和处理效率。
|
缓存 fastjson Java
FastJson - JSONPath 使用
FastJson - JSONPath 使用
2347 0
|
自然语言处理 Java API
如何在Java中实现多语言国际化支持
如何在Java中实现多语言国际化支持
1010 1
|
消息中间件 存储 Apache
精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的事务性消息的底层原理并在分析其实际开发场景
事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。RocketMQ的事务消息提供类似 X/Open XA 的分布事务功能,通过事务消息能达到分布式事务的最终一致。
1328 2
精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的事务性消息的底层原理并在分析其实际开发场景
|
Prometheus 监控 Cloud Native
Spring Boot中使用Micrometer进行指标监控
Spring Boot中使用Micrometer进行指标监控
|
存储 JSON Java
mapstruct最佳实践
当两个对象属性不一致时,比如User对象中某个字段不存在与UserVo当中时,在编译时会有警告提示,可以在@Mapping中配置 ignore = true,当字段较多时,可以直接在@Mapper中设置unmappedTargetPolicy属性或者unmappedSourcePolicy属性为 ReportingPolicy.IGNORE即可。 如果项目中也同时使用到了 Lombok,一定要注意 Lombok的版本要等于或者高于1.18.10,否则会有
560 0