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;
}

浙公网安备 33010602011771号