java实现字典回写

目录

前言

实现

新增注解

新增切面


前言

字典管理是大部分系统都有的一个模块,用来管理业务上的字典数据,通常是树状结构,用键值对进行存储。然后具体业务场景使用字典数据时,业务数据往往存的是字典编码,因此查看业务数据时就需要同时返回字典对应的值,这便是字典回写。

实现字典回写其实也很容易,无非是哪种方式更优雅,比如最low的做法就是在类中增加字典值字段,数据查出来后再根据字典编码统一去字典表查出对应的字典值并赋到对应的字段上;稍微好点的方式是通过mybatis拦截器在查出数据通过反射获取字典编码并直接去查字典表,省去了在service层面去查的通用逻辑。但这两种方式都有个弊端,就是都得新增字典值冗余字段,业务场景一多就特别麻烦。

这里推荐第三种方式,通过切面的方式在controller层返回数据的时候动态增加字典值字段,更优雅的完成字典回写。

实现

新增注解

这里需要新增两个注解,一个用来作为切点,一个用来标识字典字段

/*** 字典方法标识*/
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DictionaryMethod {
}/*** 字典字段标识*/
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DictionaryField {/*** 回写目标字段,不填则是原字段名 + Name*/String writeBackTargetField() default "";
}


新增切面

主要思路就是拿到controller层返回的数据,通过反射获取对应的字典字段并新增字段进行赋值,结果集使用map接收

/*** 字典回写切面*/
@Slf4j
@Aspect
@Component
@AllArgsConstructor
public class DictionaryFieldAspect {private SystemDictionaryItemMapper systemDictionaryItemMapper;@Around("@within(org.springframework.web.bind.annotation.RestController) && @annotation(com.hthjsj.icp.entity.common.annotation.DictionaryMethod)")public Object around(ProceedingJoinPoint pjp) throws Throwable {Object object = pjp.proceed();if (object instanceof HttpResult && ((HttpResult) object).getCode() == 0) {// 只尝试处理正常返回的数据HttpResult result = (HttpResult) object;Object data = result.getData();if (data instanceof Page) {Page page = (Page) data;List list = page.getList();if (!list.isEmpty()) {List<Map<String, Object>> listResult = fillField(list);page.setList(listResult);return HttpResult.success(page);}} else if (data instanceof Collection) {Collection collection = (Collection) object;if (!collection.isEmpty()) {List<Map<String, Object>> listResult = fillField(collection);return HttpResult.success(listResult);}} else {return HttpResult.success(fillField(object));}}return object;}private List<Map<String, Object>> fillField(Collection list) throws Exception {List<Map<String, Object>> result = new ArrayList<>();for (Object o : list) {result.add(fillField(o));}return result;}private Map<String, Object> fillField(Object o) throws Exception {Map<String, Object> map = PropertyUtils.describe(o);Class<?> objectClass = o.getClass();Arrays.stream(objectClass.getDeclaredFields()).forEach(field -> {DictionaryField dictionaryField = field.getAnnotation(DictionaryField.class);if (dictionaryField != null) {field.setAccessible(true);try {String appCode = SecurityUtil.getSourceAppCode();Object fieldInstance = field.get(o);String code = (String) fieldInstance;String value = systemDictionaryItemMapper.getValueByCode(code, appCode);String writeBackTargetField = StringUtils.isNotEmpty(dictionaryField.writeBackTargetField()) ? dictionaryField.writeBackTargetField() : field.getName() + "Name";map.put(writeBackTargetField, value);} catch (Exception e) {log.error("字典回写异常:{}", e.getMessage());}}});return map;}
}

具体使用时只需要在controller层的方法上加上 @DictionaryMethod,同时在返回的字典字段加上 @DictionaryField 即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路由器配置静态和默认路由实现VLAN之间的通信

目录 华为路由器静态路由和默认路由的写法 静态路由和默认路由的区别 案例 华为路由器静态路由和默认路由的写法 配置静态路由&#xff1a; [Huawei] ip route-static <目标网络> <子网掩码> <下一跳地址> 实例&#xff1a;将目标网络192.168.10.0/24的流…

一站式吃鸡利器,提升游戏战斗力,助您稳坐鸡王宝座!

各位吃鸡玩家们&#xff0c;听说过绝地求生作图工具吗&#xff1f;想知道如何提高游戏战斗力、分享顶级作战干货、查询装备皮肤库存&#xff1f;还在为游戏账号安全而担心吗&#xff1f;别急&#xff0c;今天就为您介绍一款一站式吃鸡利器&#xff0c;满足您的所有需求&#xf…

如何快速搭建一个react项目?如何使用react脚手架快速搭建项目?

如何使用react脚手架快速搭建项目&#xff1f; 一、前提 电脑已经安装了node和npm环境。 react文档中要求Node > 8.10 和 npm > 5.6&#xff0c;查看版本&#xff1a;node -v&#xff1b;npm -v&#xff1b; 二、步骤 1、在合适的文件夹中打开命令行窗口cmd 2、全局安…

SkyWalking搭配springboot应用(三)

title: “SkyWalking搭配springboot应用(三)” createTime: 2021-07-13T16:27:5708:00 updateTime: 2021-07-13T16:27:5708:00 slug: “SkyWalking搭配springboot应用(三)” draft: false author: “ggball” tags: [“skywalking”] categories: [“java”] description: “sk…

[论文笔记]Prefix Tuning

引言 今天带来微调LLM的第二篇论文笔记Prefix-Tuning。 作者提出了用于自然语言生成任务的prefix-tuning(前缀微调)的方法,固定语言模型的参数而优化一些连续的任务相关的向量,称为prefix。受到了语言模型提示词的启发,允许后续的token序列注意到这些prefix,当成虚拟toke…

美篇作文网教学资源源码-自带作文数据

非常漂亮的UI设计和页面排版&#xff01; 自适应手机pc端 页面内容均支持自定义 可以用来做网站矩阵&#xff0c;或者增强你其他网站板块&#xff0c;或者单独运营都可以。 可以通过广告方式变现&#xff0c;或者引流等等 友好的seo&#xff0c;更容易被浏览器收录 关注青狐…

网络爬虫学习笔记 1 HTTP基本原理

HTTP原理 ~~~~~ HTTP&#xff08;Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种使用最为广泛的网络请求方式&#xff0c;常见于在浏览器输入一个地址。 1. URI和URL URL&#xff08;Universal Resource Locator&#xff0c;统一资源定位器&…

Android导航抽屉

本文所有代码均位于https://github.com/MADMAX110/CatChat 之前使用过标签页布局可以让用户在应用中轻松地导航。 当只有为数不多地几个类别屏幕&#xff0c;而且它们都在应用层次结构地同一级上&#xff0c;标签页布局就很适用。 而抽屉导航可以实现更多选择&#xff0c;这是一…

MySQL基础-多表查询

目录 简单概述 1.多表之间的关系 1.1 一对多/多对一 1.2 多对多 1.3 一对一 2. 多表查询-内连接 2.1 隐式内连接 2.2 显式内连接 2.3 内连接小结 3.多表查询-外连接 3.1 左外连接 3.2 右外连接 4.多表查询-自连接 4.1 应用 5.多表查询-联合查询 6.子查询 6.1 标量子…

leetcode 10. 正则表达式匹配

2023.9.20 感觉是目前做过dp题里最难的一题了... 本题首要的就是需要理解题意&#xff0c;翻了评论区我才发现之前一直理解的题意是错的。 我原来理解的 “ *匹配0次” 是指&#xff1a;*直接消失&#xff0c;不会影响到前面的字符。 但是*和前一个字符其实是连体的&#xff0…

现代 GPU 容易受到新 GPU.zip 侧通道攻击

来自四所美国大学的研究人员开发了一种新的 GPU 侧通道攻击&#xff0c;该攻击利用数据压缩在访问网页时泄露现代显卡中的敏感视觉数据。 研究人员通过 Chrome 浏览器执行跨源 SVG 过滤器像素窃取攻击&#xff0c;证明了这种“ GPU.zip ”攻击的有效性。 研究人员于 2023 年 …

mysql面试题2:说一说MySQL的架构设计?一条 MySQL 语句执行的步骤?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说MySQL的架构设计? MySQL的架构设计主要包括以下几个组件: 连接器(Connector):负责与客户端建立连接,并进行身份验证和授权。 查询缓存…

黑马JVM总结(二十五)

&#xff08;1&#xff09;字节码指令-cinit 构造方法可以分为两类&#xff0c;一类是cinit 一类init cinit是整个类的构造方法 putstatic&#xff1a;进行static变量的赋值&#xff0c;是到常量池里找到名字一个叫做i的变量 &#xff08;2&#xff09;字节码指令-init in…

React基础知识点

1、简述什么是React&#xff08;概念&#xff09;&#xff1f; React是Facebook开发的一款用于构建用户界面的JS库。React一般被采用作为MVC中的V层&#xff0c;它不依赖其他任何的库&#xff0c;因此在开发中&#xff0c;可以与任何其他的库集成使用&#xff0c;包括Jquery等…

自适应阈值分割-OTSU

OTSU 在前面固定阈值中选取了一个阈值为127进行阈值分割&#xff0c;那如何知道选的这个阈值效果好不好呢&#xff1f;答案是&#xff1a;不断尝试&#xff0c;所以这种方法在很多文献中都被称为经验阈值。 Otsu阈值法就提供了一种自动高效的二值化方法。Otsu算法也称最大类间…

【数据库——MySQL】(5)运算符、表达式和系统函数

目录 1. 常量1.1 数值常量1.2 字符串常量1.3 日期时间常量1.4布尔值1.5 NULL值 2. 变量2.1 系统变量2.2 用户变量 3. 运算符与表达式3.1 赋值运算符3.2 算术运算符3.3 比较运算符3.4 判断运算符3.5 字符串匹配3.6 逻辑运算符和位运算符3.7 表达式和运算符的优先级 4. 系统函数参…

2785. 将字符串中的元音字母排序

2785. 将字符串中的元音字母排序 给你一个下标从 0 开始的字符串 s &#xff0c;将 s 中的元素重新 排列 得到新的字符串 t &#xff0c;它满足&#xff1a; 所有辅音字母都在原来的位置上。更正式的&#xff0c;如果满足 0 < i < s.length 的下标 i 处的 s[i] 是个辅音…

python+vue电子资源管理系统

能实现不出家门就可以通过网络进行系统管理&#xff0c;交易等&#xff0c;而且过程简单、快捷。同样的&#xff0c;在人们的工作生活中&#xff0c;也就需要互联网技术来方便人们的日常工作生活&#xff0c;实现工作办公的自动化处理&#xff0c;实现信息化&#xff0c;无纸化…

【图论C++】树的直径(DFS 与 DP动态规划)

》》》算法竞赛 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载…

点云从入门到精通技术详解100篇-基于激光点云语义的环境感知

目录 前言 环境感知传感器研究现状 单一激光雷达应用 激光雷达与相机融合的应用