如何基于SpringBoot实现自动装配返回属性
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,这篇文章主要介绍了如何基于SpringBoot实现自动装配返回属性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:需求背景在业务开发
千家信息网最后更新 2025年01月17日如何基于SpringBoot实现自动装配返回属性
这篇文章主要介绍了如何基于SpringBoot实现自动装配返回属性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
一:需求背景
在业务开发中经常会有这个一个场景,A(业务表)表中会记录数据的创建人,通常我们会用userId字段记录该数据的创建者,但数据的使用方会要求展示该数据的创建者姓名,故我们会关联用户表拿该用户的姓名。还有一些枚举值的含义也要展示给前端。导致原本一个单表的sql就要写成多表的关联sql,以及枚举含义的转换很是恶心。
例如:业务对象BusinessEntity.java
public class BusinessEntity { /** * 创建者id */ private Long createUserId; * 创建者名称 (需要关联用户表) private String userName; * 数据状态(0:有效,1失效) private String status; * 数据状态含义(需要解析0或1的含义给前端) private String statusName; * 数据集合 private Listlist;}
二:设计思路
就像@JsonFormat注解,可以指定返回日期格式。我们是不是可以也自定义一个注解,通过这个注解,我们可以自动的把需要联表的数据userName自动填充,需要解析的数据数据statusName如何通过枚举解析。
故定义枚举@AutowiredAttribute如下
/** * 自动装配属性 */@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})@Retention(RUNTIME)@Documentedpublic @interface AutowiredAttribute { /** * 当为默认值时,表明该属性为javaBean,且该javaBean需要自动注入属性 * 否则为指向的某一个属性 * * @return */ String param() default ""; * 默认为BaseEnum.class, * 当为默认时注入数据的来源时redis缓存, * 否则为枚举类型 Class extends BaseEnum> enumClass() default BaseEnum.class; * 数据源 DataSourceEnum dataSource() default DataSourceEnum.EMPTY;}
定义公共枚举继承继承接口BaseEnum
public interface BaseEnum { String getCode(); String getMsg();}
定义数据源枚举如下dataSource
public enum DataSourceEnum implements BaseEnum { SYSTEM_DICT("sys:dict:", "系统字典值", "sys_dict_value", "name"), USER_NAME("user:name:", "用户的id与姓名的映射", "sys_user", "user_name"), USER_ROLE("user:role:", "角色id于角色名称映射", "sys_role", "name"), DEPT_NAME("dept:name:", "部门的id与部门名称的映射", "sys_dept", "name"), EMPTY("00", "默认", "", ""); DataSourceEnum(String code, String msg, String tableName, String tableColumn) { this.code = code; this.msg = msg; this.tableName = tableName; this.tableColumn = tableColumn; } private String code; private String msg; /** * 表明 */ private String tableName; * 表的列 private String tableColumn; @Override public String getCode() { return code; public String getMsg() { return msg; public String getTableName() { return tableName; public String getTableColumn() { return tableColumn;}
三:使用方法
对比原对象:通过新增注解,就避免的关联查询和数据解析
public class BusinessEntity { /** * 创建者id */ private Long createUserId; * 创建者名称 (需要关联用户表) @AutowiredAttribute(param = "createUserId", dataSource = DataSourceEnum.USER_NAME) private String userName; * 数据状态(0:有效,1失效) private String status; * 数据状态含义(需要解析0或1的含义给前端) @AutowiredAttribute(param = "status", enumClass = StatusEnum.class) private String statusName; * 数据集合 @AutowiredAttribute private Listlist;}
四:注解解析器(核心代码)
/** * 填充相应体 */@Component@ControllerAdvice()public class FillResponseBodyAdvice implements ResponseBodyAdvice { @Autowired RedissonClient redissonClient; JdbcTemplate jdbcTemplate; private static String GET_CODE_METHOD_NAME = "getCode"; private static String GET_MSG_METHOD_NAME = "getMsg"; @Override public boolean supports(MethodParameter returnType, Class converterType) { if (ResponseResult.class.getName().equals(returnType.getMethod().getReturnType().getName())) { return true; } return false; } public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if (((ResponseResult>) body).getCode() == 200) {//仅仅对相应为200结果处理 Object data = ((ResponseResult>) body).getData(); Class> aClass = data.getClass(); if (data instanceof List) { //集合对象设置属性 setForListBeanArr((List) data); } else { //判断是否为自定义java对象 if (aClass.getSuperclass() instanceof Object) { setForJavaBeanArr(data, aClass); } } return body; /** * 为集合对象设置属性 * * @param list */ void setForListBeanArr(List
实现了从数据库(mysql)自动查询,并把结果缓冲到数据库。
感谢你能够认真阅读完这篇文章,希望小编分享的"如何基于SpringBoot实现自动装配返回属性"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
数据
对象
属性
创建者
含义
注解
用户
关联
名称
状态
篇文章
装配
业务
前端
姓名
用户表
有效
数据库
数据源
方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
定制网络技术品牌
华阴市公安局网络安全大队
全屋定制软件开发
互联网科技 旅游
学软件开发的项目心得怎么写
u8普及版数据库连接
内江网络服务器机柜
数字化网络技术
浦东新区加工软件开发品牌
腾讯云服务器管理器分区
软件开发费部署费用标准
是数据库的核心与基础
外国数据库有几个
黑龙江虚拟主机云服务器
建个服务器
服务器数据上传
国家网络安全学院今年招生
服务器硬盘有哪些参数
网络安全审查办啥时候结束
网络技术的代码
自动化外汇交易软件开发
计算机心理学数据库
福建高配置服务器云服务器
gta5数据库类别
软件开发是什么税
使用手机网络安全知识内容
广州吉策网络技术有限公司
网络技术发尽史
梦幻2020是哪个服务器开的区
服务器硬盘有哪些参数