Springboot+AOP怎么实现时间参数格式转换
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,本文小编为大家详细介绍"Springboot+AOP怎么实现时间参数格式转换",内容详细,步骤清晰,细节处理妥当,希望这篇"Springboot+AOP怎么实现时间参数格式转换"文章能帮助大家解决疑惑
千家信息网最后更新 2025年11月09日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安全错误
数据库的锁怎样保障安全
以下哪些角色属于软件开发团队
周口鹏讯互联网科技有限公司
网络技术员实习自我感受
网络安全奖项名称
不怕网络套路深网络安全解隐忧
培训机构如何找网络安全学习
伍加贰网络技术有限公司
网络安全保险短剧
对数据库进行修改操作
网络安全新旧动能转型
远程重启服务器资源管理器
地铁逃生哪个服务器的人少
乡镇网络安全自查整改工作报告
安卓软件开发企业
浙江省推广网络安全课
刘健祥网络安全
社区网络安全周小结
市交通运输局组织开展网络安全
互联网科技接地气
apk运行只要服务器ip地址吗
四川程序软件开发需要多少钱
科技网络技术的发展书
索尼耳机app连不上服务器
教育工作者与网络安全
php网站数据库安装
部队网络安全小视频
对数据库进行修改操作
厦门微晟互联网科技黄伟
潜江创客网络技术有限公司
专业报岗数据库