一、定义转换规则
定义的类上边增加@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 { }