相关文章推荐
独立的乒乓球  ·  线程,如何通过pthread_t这个线程id ...·  1 年前    · 
傻傻的吐司  ·  【Python】使用scatter()绘制散 ...·  2 年前    · 
憨厚的长颈鹿  ·  C语言字符串,八进制和十六进制的表示_八进制 ...·  2 年前    · 
深情的围巾  ·  斯坦福大学新课CS224W-2019-图网络 ...·  2 年前    · 
Code  ›  Mapstruct自定义转换规则开发者社区
string target list swagger
https://cloud.tencent.com/developer/article/2159195
帅气的煎饼
2 年前
作者头像
小石头
0 篇文章

Mapstruct自定义转换规则

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 小石头 > Mapstruct自定义转换规则

Mapstruct自定义转换规则

作者头像
小石头
发布 于 2022-11-10 21:45:28
1.4K 0
发布 于 2022-11-10 21:45:28
举报

一、定义转换规则

定义的类上边增加@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;
 
推荐文章
独立的乒乓球  ·  线程,如何通过pthread_t这个线程id判断线程是否已经终止_c++pthread检查线程有没有结束-CSDN博客
1 年前
傻傻的吐司  ·  【Python】使用scatter()绘制散点图 - OLIVER_QIN - 博客园
2 年前
憨厚的长颈鹿  ·  C语言字符串,八进制和十六进制的表示_八进制字符串_环海之风的博客-CSDN博客
2 年前
深情的围巾  ·  斯坦福大学新课CS224W-2019-图网络机器学习算法-视频及ppt资源分享_51CTO博客_斯坦福大学cs课程
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号