两个类文件,实现根据返回的id显示对应的人员信息增强返回

后台与前台交互时,由于后台存放的原始信息可能就是一些id或code,要经过相应的转换才能很好地在前台展示。

比如: select id, user_id from user

直接返回给前台时,前台可能要根据你这个user_id作为参数,再请求一次后台,获取对应的人员信息实体,以作人员信息展示。

这样多了一次IO,同时还要根据不同的场景写很多的重复代码。比如第一次IO时就连接查出对应的返回实体,或者本来不需要后续又需要这些实体就又要补上代码。

这些重复性的工作抽像出通用的代码解决,我的做法是这样:

1、首先我的人员信息是有缓存的

2、自定义一个注解@BaseId(第一个类文件)

3、写一个AOP(第二个类文件)

这个AOP在@Controller方法返回前,校验返回的实体是固定的泛型且泛型参数对应的实体类中存在被@BaseId注解的变量,就基于这个变量生成一个人员信息实体,加进这个返回实体中返回给前台。下面且看代码:

一、注解类

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface BaseId {
}

二、AOP类

/*** 对GetMapping接口的返回做条件性增强,* 1、返回的类型为TableDataInfo的。里面的rows对应的实体类如果有@BaseId的,增加对应的StaffMain字段返回** @author wack* @version 1.0* @since 2023/8/3*/
@Aspect
@Slf4j
@Component
public class GetResponseAspect {private static final String STAFF_MAIN = "xxx.xxx.basis.model.staff.StaffMain";@Autowiredprivate IStaffService staffService;@AfterReturning(pointcut = "@annotation(getMapping)", returning = "jsonResult")public void beforeReturnIng(JoinPoint joinPoint, Object jsonResult, GetMapping getMapping) throws ClassNotFoundException {if (jsonResult instanceof TableDataInfo) {List rows = ((TableDataInfo) jsonResult).getRows();List newRows = new ArrayList();if (CollectionUtils.isNotEmpty(rows) && rows.get(0) != null) {Class<?> returnModel = rows.get(0).getClass();Field[] declaredFields = returnModel.getDeclaredFields();if (Arrays.stream(declaredFields).filter(obj -> obj.getAnnotation(BaseId.class) != null).findAny().isPresent()) {for (Object row : rows) {// 找到注解为baseId的字段,生成一个新的StaffMain 字段来承载对应的人员信息DynamicObject dynamicBean = new DynamicObject();Map<String, Class> allPropertyType = dynamicBean.getAllPropertyType(row);Map<String, Object> allPropertyValue = dynamicBean.getAllPropertyValue(row);for (Field declaredField : declaredFields) {if (declaredField.getAnnotation(BaseId.class) != null) {String fieldValue = ReflectUtils.getFieldValue(row, declaredField.getName());allPropertyType.put(declaredField.getName() + "Staff", Class.forName(STAFF_MAIN));allPropertyValue.put(declaredField.getName() + "Staff", staffService.getStaffCacheInfo(fieldValue));}}dynamicBean.addProperty(allPropertyType, allPropertyValue);row = dynamicBean.getObject();newRows.add(row);}if (CollectionUtils.isNotEmpty(newRows)) ((TableDataInfo) jsonResult).setRows(newRows);}}}}class DynamicObject {private Object object; //对象private BeanMap beanMap; //对象的属性private BeanGenerator beanGenerator; //对象生成器private Map<String, Class> allProperty; //对象的<属性名, 属性名对应的类型>/*** 给对象属性赋值** @param property* @param value*/public void setValue(String property, Object value) {beanMap.put(property, value);}private void setValue(Object object, Map<String, Class> property) {for (String propertyName : property.keySet()) {if (allProperty.containsKey(propertyName)) {Object propertyValue = ReflectUtils.getFieldValue(object, propertyName);this.setValue(propertyName, propertyValue);}}}private void setValue(Map<String, Object> propertyValue) {for (Map.Entry<String, Object> entry : propertyValue.entrySet()) {this.setValue(entry.getKey(), entry.getValue());}}/*** 通过属性名获取属性值** @param property* @return*/public Object getValue(String property) {return beanMap.get(property);}/*** 获取该bean的实体** @return*/public Object getObject() {return this.object;}private Object generateObject(Map propertyMap) {if (null == beanGenerator) {beanGenerator = new BeanGenerator();}Set keySet = propertyMap.keySet();for (Iterator i = keySet.iterator(); i.hasNext(); ) {String key = (String) i.next();beanGenerator.addProperty(key, (Class) propertyMap.get(key));}return beanGenerator.create();}/*** 添加属性名与属性值** @param propertyType* @param propertyValue*/public void addProperty(Map propertyType, Map propertyValue) {if (null == propertyType) {throw new RuntimeException("动态添加属性失败!");}Object oldObject = object;object = generateObject(propertyType);beanMap = BeanMap.create(object);if (null != oldObject) {setValue(oldObject, allProperty);}setValue(propertyValue);if (null == allProperty) {allProperty = propertyType;} else {allProperty.putAll(propertyType);}}/*** 获取对象中的所有属性名与属性值** @param object* @return* @throws ClassNotFoundException*/public Map<String, Class> getAllPropertyType(Object object) throws ClassNotFoundException {Map<String, Class> map = new HashMap<>();Field[] fields = object.getClass().getDeclaredFields();for (int index = 0; index < fields.length; index++) {Field field = fields[index];String propertyName = field.getName();String typeName = field.getGenericType().getTypeName();if ("long".equals(typeName)) {typeName = "java.lang.Long";}if ("int".equals(typeName)) {typeName = "java.lang.Integer";}if ("float".equals(typeName)) {typeName = "java.lang.Float";}if ("double".equals(typeName)) {typeName = "java.lang.Double";}if ("boolean".equals(typeName)) {typeName = "java.lang.Boolean";}if ("char".equals(typeName)) {typeName = "java.lang.Character";}if (typeName.indexOf("List") > -1) {typeName = "java.util.List";}Class<?> propertyType = Class.forName(typeName);map.put(propertyName, propertyType);}defaultEndType(map);return map;}private void defaultEndType(Map<String, Class> map) {map.put("createId", String.class);map.put("modifyId", String.class);map.put("createDate", Date.class);map.put("modifyDate", Date.class);}/*** 获取对象中的所有属性名与属性值** @param object* @return*/public Map<String, Object> getAllPropertyValue(Object object) {Map<String, Object> map = new HashMap<>();Field[] fields = object.getClass().getDeclaredFields();for (int index = 0; index < fields.length; index++) {Field field = fields[index];String propertyName = field.getName();Object propertyValue = ReflectUtils.getFieldValue(object, propertyName);map.put(propertyName, propertyValue);}defaultEndValue(object,map);return map;}private void defaultEndValue(Object object,Map<String, Object> map) {map.put("createId", ReflectUtils.getFieldValue(object, "createId"));map.put("modifyId", ReflectUtils.getFieldValue(object, "modifyId"));map.put("createDate", ReflectUtils.getFieldValue(object, "createDate"));map.put("modifyDate", ReflectUtils.getFieldValue(object, "modifyDate"));}}
}

在实体类中加注解

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

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

相关文章

Ubuntu之apt-get系列--apt-get安装软件的方法/教程

原文网址&#xff1a;Ubuntu之apt-get系列--apt-get安装软件的方法/教程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Ubuntu使用apt-get安装软件的方法。 安装软件 先更新列表 sudo apt-get update 安装软件 sudo apt-get install <package name>[<version>]…

阿里云2核4G服务器5M带宽五年租用价格表

阿里云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS&#xff0c;轻量2核4G4M带宽服务器297元一年&#xff0c;2核4G云服务器ECS可以选择计算型c7、c6或通用算力型u1实例等&#xff0c;买5年可以享受3折优惠&#xff0c;阿腾云分享阿里云服务器2核4G5M带宽五年费用表&…

什么是RESTful API,Spring MVC如何支持RESTful架构

文章目录 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;Java框架 ✨文章内容&#xff1a;Spring MVC支持RESTful架构 &#x1f91d;希望作者的文章能对你有所帮助&#xf…

【100天精通Python】Day50:Python Web编程_Django框架从安装到使用

目录 1 安装Django Web框架 2 创建一个Django 项目 3 数据模型 3.1 在应用程序的 models.py 文件中定义数据模 3.2 创建模型的迁移文件并应用 3.2.1 查询模型对象&#xff1a; 3.2.2 创建新模型对象&#xff1a; 3.2.3 更新模型对象&#xff1a; 3.2.4 删除模型对象&a…

HTML 标签讲解

HTML 标签讲解 HTML 语言结构根元素元数据元素主体根元素大纲元素文本内容语义化内联文本图像与多媒体编辑标识table表格内容表单内容table表单 HTML 语言结构 Markup &#xff08;标记、标签&#xff09;用来容纳和描述内容 严格意义上&#xff0c;标签是指开始标签&#xf…

华为OD机试 - 关联子串 - 滑动窗口(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明4、换个思路 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A…

vue 打印

vue-print-nb插件使用 vue 打印 vue-print-nb - 简书 1、media print 内样式无效问题 <style lang"scss"> media print {} </style> style上不能加scoped; 2、分页问题 A4纸的长宽&#xff1a;210mm297mm&#xff0c;css中支持mm单位&#xff0c;可…

关于工信部发布的app备案以及小程序备案流程

一、相关政策 通知&#xff1a;https://beian.miit.gov.cn/#/Integrated/lawStatute 腾讯备案&#xff1a;网站备案 首次备案-网站备案-文档中心-腾讯云 阿里备案&#xff1a;网站备案_ICP备案_备案迁移_备案-阿里云 二、遇到的问题 APP备案 安卓获取平台公钥方法&#xf…

数学建模之插值法

目录 1 插值法概述2 插值法原理3 拉格朗日插值4 牛顿插值5 三次Hermite插值&#xff08;重点&#xff09;6 三次样条插值&#xff08;重点&#xff09;7 各种插值法总结8 n 维数据的插值9 插值法拓展10 课后作业 1 插值法概述 数模比赛中&#xff0c;常常需要根据已知的函数点进…

nginx离线安装

ngixn的离线安装(centos7) 需要的依赖 gcc、gcc-c pcre-8.42.tar.gz zlib-1.2.11.tar.gz openssl-1.1.1s.tar.gz perl-5.28.0.tar.gz 在进行nginx离线安装时&#xff0c;首先查看系统是否安装 gcc、gcc-c&#xff0c;若没有进行安装&#xff0c;请先进行安装 gcc -v #查…

【快应用】快应用与网页通信踩坑合集处理

【关键词】 Web、postMessage、onMessage 【问题背景】 快应用中通过web组件加载的h5网页&#xff0c;快应用在和网页进行通信时&#xff0c;经常会遇到网页发送信息给快应用&#xff0c;快应用成功收到&#xff0c;反过来的时候&#xff0c;h5网页就没法收到了。如提示 xxx …

2019CVPR Semantic Graph Convolutional Networks for 3D Human Pose Regression

基于语义图卷积网络的三维人体姿态回归 源码 https://github.com/garyzhao/SemGCN 摘要 在本文中&#xff0c;我们研究了学习图卷积网络&#xff08;GCN&#xff09;回归的问题。GCN的当前体系结构受限于卷积滤波器和共享的变换矩阵为的小感受野。为了解决这些限制&#xff…