Springboot+AOP怎么实现时间参数格式转换
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,本文小编为大家详细介绍"Springboot+AOP怎么实现时间参数格式转换",内容详细,步骤清晰,细节处理妥当,希望这篇"Springboot+AOP怎么实现时间参数格式转换"文章能帮助大家解决疑惑
千家信息网最后更新 2025年01月18日Springboot+AOP怎么实现时间参数格式转换
本文小编为大家详细介绍"Springboot+AOP怎么实现时间参数格式转换",内容详细,步骤清晰,细节处理妥当,希望这篇"Springboot+AOP怎么实现时间参数格式转换"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
前言
场景
前端传过来的时间参数,我们后端自定义时间格式转化使用,想转成什么就转成什么。
不同业务场景,跟前端对接,一种控件基本时间参数是固定格式的,为了避免前端去转换时间参数的格式,跟前端约定好,让他们固定传递一种格式,后端自己看需求转换格式使用即可。
效果
① 从 yyyy-MM-dd HH:mm:ss 转换成 yyyy-MM-dd 使用:
② 从 yyyyMMddHHmmss 转换成 yyyy-MM-dd HH:mm:ss 使用:
③不再举例,其实就是自己想怎么转就怎么转。
实战
pom.xml (aop依赖、lombok依赖):
org.springframework.boot spring-boot-starter-web org.projectlombok lombok 1.18.20 compile org.springframework spring-aspects 5.2.7.RELEASE org.aspectj aspectjtools 1.9.5 aopalliance aopalliance 1.0 org.aspectj aspectjweaver 1.9.0 cglib cglib 3.3.0
核心(自定义注解+拦截器):
自定义注解一
DateField.java
用途: 用于标记哪个字段需要进行时间格式转换,配置旧格式,新格式(都可写默认值)。
import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target; /** * @Author: JCccc * @Date: 2022-4-11 18:45 * @Description: */ @Target({ElementType.METHOD, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface DateField { String oldPattern() default DateUtil.YYYY_MM_DD_HH_MM_SS; //新格式可以写默认也可以不写,如果业务比较固定,那么新时间格式和旧时间格式都可以固定写好 String newPattern() default "";}
自定义注解二
NeedDateFormatConvert.java
用途: 用于标记哪个接口需要进行AOP方式 时间格式转换。
import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target; /** * @Author: JCccc * @Date: 2022-4-11 18:44 * @Description: */@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface NeedDateFormatConvert { }
拦截器
DateFormatAspect.java
用途: 核心转换实现逻辑。
import com.jctest.dotestdemo.util.DateUtil;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils; import java.lang.reflect.Field;import java.util.Objects; /** * @Author: JCccc * @Date: 2022-4-11 18:57 * @Description: */@Aspect@Componentpublic class DateFormatAspect { private static Logger log = LoggerFactory.getLogger(DateFormatAspect.class); @Pointcut("@annotation(com.jctest.dotestdemo.aop.dateFormat.NeedDateFormatConvert)") public void pointCut() { } @Around("pointCut()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { //转换 dateFormat(joinPoint); return joinPoint.proceed(); } public void dateFormat(ProceedingJoinPoint joinPoint) { Object[] objects = null; try { objects = joinPoint.getArgs(); if (objects.length != 0) { for (int i = 0; i < objects.length; i++) { //当前只支持判断对象类型参数 convertObject(objects[i]); } } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("参数异常"); } } /** * 转换对象里面的值 * * @param obj * @throws IllegalAccessException */ private void convertObject(Object obj) throws IllegalAccessException { if (Objects.isNull(obj)) { log.info("当前需要转换的object为null"); return; } Field[] fields = obj.getClass().getDeclaredFields(); for (Field field : fields) { boolean containFormatField = field.isAnnotationPresent(DateField.class); if (containFormatField) { //获取访问权 field.setAccessible(true); DateField annotation = field.getAnnotation(DateField.class); String oldPattern = annotation.oldPattern(); String newPattern = annotation.newPattern(); Object dateValue = field.get(obj); if (Objects.nonNull(dateValue) && StringUtils.hasLength(oldPattern) && StringUtils.hasLength(newPattern)) { String newDateValue = DateUtil.strFormatConvert(String.valueOf(dateValue), oldPattern, newPattern); if (Objects.isNull(newDateValue)){ log.info("当前需要转换的日期数据转换失败 dateValue = {}",dateValue.toString()); throw new RuntimeException("参数转换异常"); } field.set(obj, newDateValue); } } } } }
工具类
DateUtil.java
用途: 时间格式转换函数、定义各种时间格式。
import lombok.extern.slf4j.Slf4j;import java.time.LocalDateTime;import java.time.format.DateTimeFormatter; /** * @Author: JCccc * @Date: 2022-4-1 14:48 * @Description: */@Slf4jpublic class DateUtil { public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; public static final String YYYY_MM_DD = "yyyy-MM-dd"; public static final String YYYY_MM = "yyyy-MM"; public static final String YYYY = "yyyy"; public static final String MM = "MM"; public static final String DD = "dd"; public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static final String YYYYMMDD = "yyyyMMdd"; /** * 指定日期格式转换 * * @param dateStr * @param oldPattern * @return */ public static String strFormatConvert(String dateStr, String oldPattern,String newPattern) { try { DateTimeFormatter oldFormatter = DateTimeFormatter.ofPattern(oldPattern); DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern(newPattern); return LocalDateTime.parse(dateStr, oldFormatter).format(newFormatter); } catch (Exception e) { log.error("strToDate is Exception. e:", e); return null; } }}
使用
UserQueryVO.java
import com.jctest.dotestdemo.aop.dateFormat.DateField;import com.jctest.dotestdemo.util.DateUtil;import lombok.Data; import java.io.Serializable; /** * @Author: JCccc * @Date: 2022-4-1 14:48 * @Description: */@Datapublic class UserQueryVO implements Serializable { /** * 开始时间 */ @DateField(oldPattern =DateUtil.YYYY_MM_DD_HH_MM_SS, newPattern = DateUtil.YYYY_MM_DD) private String startDate; /** * 结束时间 */ @DateField(oldPattern =DateUtil.YYYY_MM_DD_HH_MM_SS,newPattern = DateUtil.YYYY_MM_DD) private String endDate;}
接口
import com.jctest.dotestdemo.aop.dateFormat.NeedDateFormatConvert;import com.jctest.dotestdemo.vo.UserQueryVO;import org.springframework.web.bind.annotation.*; /** * @Author: JCccc * @Date: 2022-4-18 11:52 * @Description: */@RestControllerpublic class UserController { @NeedDateFormatConvert @PostMapping("/test") public String test( @RequestBody UserQueryVO userQueryVO){ System.out.println("时间格式转化完成:"); System.out.println(userQueryVO.getStartDate()); System.out.println(userQueryVO.getEndDate()); return userQueryVO.toString(); }}
调用
读到这里,这篇"Springboot+AOP怎么实现时间参数格式转换"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
格式
时间
参数
用途
前端
文章
注解
业务
内容
场景
对象
接口
日期
标记
核心
拦截器
不同
妥当
函数
前言
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
园区网络安全设计弱电
ssh服务器地址
对数据库技术的期望
服务器 上传网站
网络安全风险防范知识讲座
数据库一整自增
数据库不存在但拒绝访问
浙江网络授时模块服务器虚拟主机
cmd连接远程服务器
查看其他数据库中的表命令
共享货车软件开发
服务器管理 远程
csgo 服务器查看
崇明区通信网络技术常见问题
dns服务器中的soa邮箱
软件开发入门事例
数据库迁移测试方案
WOS数据库郑州轻工业大学
一年级网络安全进校园的手抄报
数据库字段怎么查询数据类型
秦皇岛麦芽网络技术有限公司
网络安全在身边观看心得
逛逛网厦门网络技术有限公司股东
ORACLE数据库块
提交表单数据到数据库中
驾校数据库清理
惠州三轴点胶软件开发
使命召唤5服务器启用作弊模式
jacw软件开发工具
简单工作日志软件开发