jackson在返回之前查询redis填充字段信息

前言

​ 有sys_field_management表,其中它有unit字段,该字段以json格式存储的是sys_base_unit表的主键id,要求查询sys_field_management表时,将相应的sys_base_unit信息查询出来,同时该查询频繁使用,要求减少对数据库的操作。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_field_management
-- ----------------------------
DROP TABLE IF EXISTS `sys_field_management`;
CREATE TABLE `sys_field_management`  (
  `id` bigint(0) NOT NULL,
  `category_id` bigint(0) NULL DEFAULT NULL COMMENT '分类Id主键',
  `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT NULL COMMENT '字段编码',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT NULL COMMENT '名称',
  `description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明',
  `type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT NULL COMMENT '字段类型',
  `date_format` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT NULL COMMENT '日期类型',
  `point_length` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs NULL DEFAULT NULL COMMENT '数据修约',
  `unit` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '单位',
  `option_arr` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '选项内容',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `create_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',
  `modify_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `modify_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',
  `is_valid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '是否删除(Y:删除,N:未删除)',
  `product_id` bigint(0) NULL DEFAULT NULL COMMENT '产品id',
  `tenant_id` bigint(0) NULL DEFAULT NULL COMMENT '租户id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字段管理表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sys_field_management
-- ----------------------------
INSERT INTO `sys_field_management` VALUES (1952276477354905602, 1942132344102223873, 'smq695726', 'jei测试', '测试使用', 'numberRange', '', '0', '{\"id\":\"1940244114930171905\"}', '[{\"label\":\"\",\"value\":\"0\",\"showClose\":null,\"children\":null,\"checked\":null}]', '2025-08-04 15:52:38', '1702555884126044162', '2025-08-04 15:52:38', '1702555884126044162', 'Y', NULL, 1702555882876141569);

SET FOREIGN_KEY_CHECKS = 1;

sys_field_management实体类

@Data
@ApiModel("字段管理参数DTO")
@TableName(value = "sys_field_management", autoResultMap = true)
public class SysFieldManagement extends BaseTenantEntity {

    @TableId(type = IdType.ASSIGN_ID)
    private Long id;

    @ApiModelProperty("分类Id主键")
    private Long categoryId;

    @ApiModelProperty("名称")
    private String name;

    @ApiModelProperty("说明")
    private String description;

    @ApiModelProperty("字段编码")
    private String code;

    @ApiModelProperty("字段类型(numberSet|input|textArea|fileUpload|image|dateTime|numberRange|checkRadio|checkBox)")
    private String type;

    // 数值|数值范围
    @ApiModelProperty(value = "单位")
    @TableField(typeHandler = JacksonTypeHandler.class)
    private SysUnitId unit;

    @ApiModelProperty(value = "数据修约(小数位数)")
    private Integer pointLength;

    // 日期
    @ApiModelProperty(value = "日期类型(date|dateTime)")
    private String dateFormat;

    // 单选|多选
    @ApiModelProperty(value = "单选|多选")
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<SelectOption> optionArr;

    @TableField(exist = false)
    @ApiModelProperty("字段使用记录list")
    private List<SysFieldUseRecordVO> fieldUseRecordList;
}

SysUnitId实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("系统单位Id实体")
@EqualsAndHashCode(callSuper = true)
@JsonIgnoreProperties(ignoreUnknown = true)
public class SysUnitId extends AbstractUnit {
    @ApiModelProperty("主键Id")
    protected String id;
}
@Data
@NoArgsConstructor
@ApiModel("系统单位抽象实体")
public abstract class AbstractUnit implements Serializable {
}
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_base_unit
-- ----------------------------
DROP TABLE IF EXISTS `sys_base_unit`;
CREATE TABLE `sys_base_unit`  (
  `id` bigint(0) NOT NULL COMMENT 'id',
  `symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '单位符号',
  `chinese_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '单位中文名称',
  `english_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '单位英文名称',
  `standard` tinyint(1) NULL DEFAULT 0 COMMENT '是否基准',
  `type_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '计量分类Id',
  `formula` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '换算公式',
  `factor` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '基准系数',
  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
  `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '状态',
  `category` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '单位类别',
  `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `create_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
  `modify_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '更新时间',
  `modify_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',
  `is_valid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'Y' COMMENT '逻辑删除编辑(Y:未删除,N:删除)',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统基础单位实体' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sys_base_unit
-- ----------------------------
INSERT INTO `sys_base_unit` VALUES (1940244114930171905, 'MXN$', '墨西哥比索', 'Mexican Peso', 0, '1940244114997280907', '', '0.4', NULL, 'ENABLE', 'SYSTEM', '2025-07-02 10:39:40', '2', '2025-07-02 10:39:40', '2', 'Y');

SET FOREIGN_KEY_CHECKS = 1;

sys_base_unit实体类

@Data
@ApiModel("系统单位实体")
@EqualsAndHashCode(callSuper = true)
@TableName(value = "sys_unit", autoResultMap = true)
public class SysUnit extends BaseTenantEntity {

    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty("主键Id")
    private String id;

    @ApiModelProperty("单位符号")
    private String symbol;

    @ApiModelProperty("单位中文名称")
    private String chineseName;

    @ApiModelProperty("单位英文名称")
    private String englishName;

    @ApiModelProperty("是否基准")
    private boolean standard = false;
    @ApiModelProperty("计量分类Id")
    private String typeId;

    @ApiModelProperty("换算公式")
    private String formula;

    @ApiModelProperty("基准系数")
    private String factor;

    @ApiModelProperty("备注")
    private String remark;

    @ApiModelProperty("状态")
    private StatusEnum status;

    @ApiModelProperty("单位类别")
    private SysUnitCategoryEnum category;

    @ApiModelProperty("基础单位Id")
    private String baseId;

}

方案

序号 操作
步骤1 将sys_base_unit表的信息缓存进redis
步骤2 通过jackson序列化,在返回之前进行数据填充

测试

将sys_base_unit表的信息缓存进redis

@Override
public void cache(Serializable tenantId) {
    try (MybatisPlusTenantContext ignored = MybatisPlusTenantContext.enable()) {
        List<SysUnitVO> units = this.baseMapper.selectTenantUnitList(tenantId);
        for (SysUnitVO unit : units) {
            commonCache.put(tenantId, CommonCacheKey.formatKey(CommonCacheKey.TENANT_UNIT, unit.getId()), unit);
        }
        log.info("租户[{}]单位缓存信息完成", tenantId);
    }

通过jackson序列化,在返回之前进行数据填充

定义注解

@Retention(RUNTIME)
@Target(FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SetUnitSerializer.class, nullsUsing = SetUnitSerializer.class)
public @interface SetUnit {
}

定义jackson序列化

@Slf4j
public class SetUnitSerializer extends JsonSerializer<SysUnitId> {

    @Override
    public void serialize(SysUnitId unitId, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        setUnit(unitId, jsonGenerator);
    }

    void setUnit(SysUnitId unitId, JsonGenerator jsonGenerator) throws IOException {
        if (unitId != null) {
            String id = unitId.getId();
            if (StrUtil.isNotBlank(id)) {
                CommonCache commonCache = SpringUtil.getBean(CommonCache.class);
                String key = CommonCacheKey.formatKey(CommonCacheKey.TENANT_UNIT, id);
                Object unit = commonCache.get(key);
                jsonGenerator.writeObject(unit);
                return;
            }
        }
        jsonGenerator.writeObject(unitId);
    }
}

通过注解标记

@Data
@ApiModel("字段管理VO")
@EqualsAndHashCode(callSuper = true)
public class SysFieldManagementVO extends BaseVO {

    @ApiModelProperty("主键id")
    private Long id;

    @ApiModelProperty("分类Id主键")
    private Long categoryId;

    @TableField(exist = false)
    @ApiModelProperty("分类")
    private SysTreeItemVO treeType;

    @ApiModelProperty("名称")
    private String name;

    @ApiModelProperty("说明")
    private String description;

    @ApiModelProperty("字段编码")
    private String code;

    @ApiModelProperty("字段类型(numberSet|input|textArea|fileUpload|image|dateTime|numberRange|checkRadio|checkBox)")
    private String type;

    // 数值|数值范围
    @ApiModelProperty(value = "单位")
    @SetUnit
    private SysUnitId unit;

    @ApiModelProperty(value = "数据修约(小数位数)")
    private Integer pointLength;

    // 日期
    @ApiModelProperty(value = "日期类型(date|dateTime)")
    private String dateFormat;

    // 单选|多选
    @ApiModelProperty(value = "单选|多选")
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<SelectOption> optionArr;

    @TableField(exist = false)
    @ApiModelProperty("字段使用记录list")
    private List<SysFieldUseRecordVO> fieldUseRecordList;

}
posted @ 2025-08-05 08:22  南翔技校毕业后  阅读(19)  评论(0)    收藏  举报