定制类网站,个人网站优秀,餐饮管理系统有哪些,wordpress页面转移前言
项目中经常需要后端将字典类型字段值的中文名称返回给前端。通过sql中关联字典表或者自定义函数不仅影响性能还不能使用mybatisplus自带的查询方法#xff0c;所以推荐使用自定义注解、Json序列化器#xff0c;Spring的缓存功能实现自动转换字典类型字段。以下实现Spri…前言
项目中经常需要后端将字典类型字段值的中文名称返回给前端。通过sql中关联字典表或者自定义函数不仅影响性能还不能使用mybatisplus自带的查询方法所以推荐使用自定义注解、Json序列化器Spring的缓存功能实现自动转换字典类型字段。以下实现SpringBoot版本为2.6.13。
一、自定义字典注解
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.common.utils.DictSerializer;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/**定义一个自定义注解用于标识需要进行字典自动翻译的字段。**/
Target({ElementType.FIELD}) //表示它只能应用在类的字段上。
Retention(RetentionPolicy.RUNTIME) //确保注解在运行时可用。
JacksonAnnotationsInside
JsonSerialize(using DictSerializer.class)//指定使用DictSerializer来处理被注解字段的序列化不加Dict注解的字段不会被DictSerializer处理。
public interface Dict {/*** 字典代码*/String type() default ;/*** 字段后缀*/String suffix() default Name;
}二、自定义Json序列化器
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.SneakyThrows;
import java.io.IOException;
import java.util.Objects;/**Dict注解中引入了JsonSerializer加了Dict注解的字段的序列化会被DictSerializer处理。不能在DictSerializer 类上加JsonComponent注解或者自定义配置类 JacksonConfig来注册Json序列化器使用注解或配置类注册序列化器会使其全局生效任何字段的序列化会被DictSerializer处理。**/
public class DictSerializer extends JsonSerializerObject {SneakyThrowsOverridepublic void serialize(Object value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {// 写入原字段的值gen.writeObject(value);if (Objects.nonNull(value)) {// 获取数据字典项服务实例// 不使用全局变量和在构造函数中获取Bean延迟加载Bean避免构造函数初始化空指针问题DictService dictService SpringContextHolder.getBean(SysDictItemService.class);// 序列化字段名称String fieldName gen.getOutputContext().getCurrentName();// 字典项注解对象Dict dictAnno gen.getCurrentValue().getClass().getDeclaredField(fieldName).getAnnotation(Dict.class);String dictItemName dictService.getDictItemName(dictAnno.type(), value);// 写入新字段名称gen.writeFieldName(fieldName dictAnno.suffix());// 写入新字段的值gen.writeString(dictItemName);}}
}三、Spring上下文工具类
Component
public class SpringContextHolder implements ApplicationContextAware {private static ApplicationContext context;public static T T getBean(ClassT clazz) {return context.getBean(clazz);}Overridepublic void setApplicationContext(ApplicationContext ctx) {context ctx;}
}
三、字典服务层含缓存
1.SpringBoot启动类上加EnableCaching注解开启缓存功能
2.根据字典代码和字典项代码查询字典项名称 /*** Cacheable为SpringBoot自带的缓存注解使用字典代码字典项代码作为缓存的key使用该注解会自动 * 缓存getDictItemName方法的返回值。*/Cacheable(value dictCache, key #dictCode:#code)Overridepublic String getDictItemName(String dictCode, Object code) {ListSysDictItem itemList ......;String value null;if(CollectionUtils.isNotEmpty(itemList)){value itemList.get(0).getItemName();}return Optional.ofNullable(value).orElse(code.toString());}3.新增或修改字典项 /*** CachePut注解是SpringBoot自带的缓存注解使用该注解在更新字典时会自动更新字典缓存注意此处 * 的key要与getDictItemName方法Cacheable注解中的key一致saveOrUpdateDictItem方法必须要返回要* 缓存的内容即字典项名称。*/CachePut(value dictCache, key #dictItem.dictCode:#dictItem.itemCode)Overridepublic String saveOrUpdateDictItem(SysDictItem dictItem) {String itemName null;int con;if(StringUtils.isBlank(dictItem.getItemId())){//新增con baseMapper.insert(dictItem);} else {//修改con baseMapper.updateById(dictItem);}if(con 0){itemName dictItem.getItemName();}return itemName;}参考资料 1.百度DeepSeek-R1满血版搜索结果 2.csdn收藏Springboot中的https://blog.csdn.net/hangbingbihai/article/details/145452376?spm1001.2014.3001.5506 https://blog.csdn.net/demo_yo/article/details/129157902?spm1001.2014.3001.5506