springboot注解使用,spring注解和springboot注解
目录
问题引出:要求:方案实现
问题引出:
最近开了新项目,项目中用到了数据字典,列表查询数据返回的时候需要手动将密码转换为姓名,到前台展示。项目经理表示可以封装一个统一的功能,避免程序员各自写各自的,代码混乱,风格不统一。
要求:
基于微服务架构,数据字典通过服务获取;简化代码,使用简单;使用使用心得
方案
大致的方向是自定义注解,在序列化的时候进行数据处理;考虑到微服务,需要将主要逻辑放到普通中,然后对外提供接口,各业务服务实现接口以获取字典数据;考虑Redis,序列化处理数据时,首先通过使用心得获取,获取不到在通过接口获取,拿到数据后存到使用心得中,然后再返回处理;也可以多做一步,在新增、修改数据字典时,同步更新使用心得内容,以保证数据有效性。
实现
定义注解@Target({ElementType .FIELD })@ Retention(保留策略.运行时)@ JacksonAnnotationsInside @ JSON serialize(使用=Dict序列化器。class)public @ interface Dict {/* *字典类型*/String type();}指定注解添加位置指定注解生效时间指定序列化处理类序列化处理类公共类字典串行器扩展StdSerializerObject实现上下文序列化程序{ /**字典注解*私人字典;public dict serializer(){ super(对象。类);}公共字典序列化程序(Dict Dict){ super(object。类);this.dict=dict}私有字符串类型;@ Override public void serialize(对象值,JsonGenerator gen,SerializerProvider provider)抛出io异常{ if(objects。为null(value)){ gen . writeobject(value);返回;} if(对象。nonnull(dict)){ type=dict。type();} //通过数据字典类型和价值获取name gen . writeobject(value);gen . write字段名称(gen . getoutput context().getCurrentName() Name );gen.writeObject(标签);} @覆盖公共JsonSerializer?创建上下文(序列化程序提供程序prov,BeanProperty beanProperty)抛出JsonMappingException { if(objects。为null(bean属性)){ return prov . findvalueserializer(bean属性。gettype(),bean属性);} Dict Dict=bean属性。获取注释(字典。类);如果(对象。nonnull(dict)){ type=dict。type();还这个;}返回prov . findnullvalueserializer(null);}}这里处理的逻辑是原先的字段内容不变,添加一个新的字段用来存储转化后的值;
数据字典获取私有静态字符串更改标签(字符串类型,字符串代码){ if(code.indexOf(,)-1) {
String[] strs = code.split(","); if (strs.length > 1) { StringBuilder sb = new StringBuilder(); for (String str : strs) { // 从缓存中获取字典。如果不行,通过SpringUtil.getBean(); 获取服务处理 sb.append(DictDataCache.getLabel(type, str)).append(separator); } return sb.substring(0, sb.length() - 1); } } // 从缓存中获取字典。如果不行,通过SpringUtil.getBean(); 获取服务处理 return DictDataCache.getLabel(type, code);}考虑存在多选的情况,先判断下是否是多选的,默认逗号拼接,后期添加入参控制;
@Overridepublic String getDictDataOptions(String typeCode,String value) { if (redisTemplate.hasKey("dict:"+typeCode+":"+value)){ return (String) redisTemplate.opsForValue().get("dict:"+typeCode+":"+value); } List<DictDataOptions> dictDataList = getDictDataHandler().getDictDataOptions(typeCode); if(CollUtil.isNotEmpty(dictDataList)) { put(typeCode, dictDataList); } if (redisTemplate.hasKey("dict:"+typeCode+":"+value)){ return (String) redisTemplate.opsForValue().get("dict:"+typeCode+":"+value); } return null;}
根据key判断Redis中是否存在,存在则直接获取,不存在则通过接口获取,获取到直接放到Redis中,然后再次从Redis获取。
protected void put(String typeCode, List<DictDataOptions> dataList) { if (CollUtil.isNotEmpty(dataList)){ for (DictDataOptions dictDataOptions : dataList) { AbstractDictHandler.redisTemplate.opsForValue().set("dict:"+typeCode+":"+dictDataOptions.getDataLabel(),dictDataOptions.getDataValue()); } }}
循环放置数据字典值
@Overridepublic List<DictDataOptions> getDictDataOptions(String typeCode) { return iSysDictService.queryDictItemsByCode(typeCode).stream() .map(e -> DictDataOptions.builder().typeCode(typeCode).dataLabel(e.getValue()).dataValue(e.getText()).build()) .collect(Collectors.toList());}
根据数据字典类型,通过接口获取数据;注意该实现类需要每个微服务实现一个;然后为了避免基础数据服务挂掉,调用报错,common中提供一个默认实现。
4.使用
@Dict(type = "inspectType")private String checkType;
在返回前端的实体中,对应字段添加注解,并指定数据字典type值
{ "id": "1522492702905954306", "professionName": "专业名称888", "checkCode": "检测项编码8", "checkProject": "rrrr检测项目88", "checkDevice": "52", "checkStandard": "检测项编码88", "referenceStandard": "wq参考标准8", "checkType": "1", "checkTypeName": "尺寸", "remarks": "ef备注备注8" },
前端获取的json会多一个字段:checkTypeName,内容为checkType 的中文值。
到此这篇关于基于Springboot一个注解搞定数据字典问题的文章就介绍到这了,更多相关Springboot数据字典内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。