场景,前端提交List<Object>,后端接收后要进行一系列数据验证,最后转成JSon存入mysql,

问题,Bo对象是List<Object> ,Entity 是String.

失败方案,

Bo属性

List<Objetct> attr;

entity属性;

String attr

// hutool工具

BeanUtil.toBean(Bo,Entity.class);

这样返回的 String attr是类似序列化的字符串,不符合需求

 

解决方案:

查看Hutool源码,发现Bo对象 implements ValueProvider 后可以对属性重写.

于是:

import cn.hutool.core.bean.copier.ValueProvider;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.web.car.goods.service.impl.GfGoodsServiceImpl;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.List;

/**
 * 商品业务对象 gf_goods
 *
 * @author ruoyi
 * @date 2022-10-09
 */

@Data
@ApiModel("商品业务对象")
public class GfGoodsAddBo  implements ValueProvider {


    /**
     * 商品标题
     */
    @ApiModelProperty("商品标题")
    @NotEmpty(message = "商品标题不能为空")
    private String goodsTitle;
    /**
     * 商品名称
     */
    @ApiModelProperty("商品名称")
    @NotEmpty(message = "商品名称不能为空")
    private String goodsName;
    /**
     * 封面图
     */
    @ApiModelProperty("封面图")
    @NotEmpty(message = "封面图不能为空")
    private String coverImg;
    /**
     * 轮播图
     */
    @ApiModelProperty("轮播图")
    @NotEmpty(message = "轮播图不能为空")
    private String bannerImg;
    /**
     * 商品详情
     */
    @ApiModelProperty("商品详情图")
    @NotEmpty(message = "商品详情图不能为空")
    private String goodsDetail;
    /**
     * 商品类型
     */
    @ApiModelProperty("商品类目")
    @NotNull(message = "商品商品类目不能为空")
    private Integer goodsCategoryId;

    @ApiModelProperty("商品规格列表组合")
    @NotNull(message = "商品规格列表组合不能为空")
    @Valid
    List<GfGoodsRuleDetailAddBo> ruleGroups;


    /**
     * 规格详情{ [长:11,22,44].[宽11,22,33] }
     */

    @ApiModelProperty("商品规格详情")
    @NotNull(message = "商品规格详情不能为空")
    @JsonFormat
    @Valid
    private List<GfRuleDetailBo> ruleDetail;


    // 把特定对象转为json存储
    @Override
    public Object value(Object key, Type valueType) {
        Field field = ReflectUtil.getField(this.getClass(), (String) key);
        Object fieldValue = ReflectUtil.getFieldValue(this, field);
        if (field!=null&&field.isAnnotationPresent(JsonFormat.class)){
            return JSONUtil.toJsonStr(fieldValue);
        }else{
            return fieldValue;
        }
    }

    @Override
    public boolean containsKey(Object key) {
        return true;
    }
}

  目前没有发现更好的解决方案.