Springboot+AOP怎么实现时间参数格式转换
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本文小编为大家详细介绍"Springboot+AOP怎么实现时间参数格式转换",内容详细,步骤清晰,细节处理妥当,希望这篇"Springboot+AOP怎么实现时间参数格式转换"文章能帮助大家解决疑惑
千家信息网最后更新 2026年11月02日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安全错误
数据库的锁怎样保障安全
互联网金融科技
广东万易互联网科技有限公司惠州分公司
互联网科技网
西安纸贵互联网科技有限公司
高科技互联网
互联网科技公司华为
互联网金融科技平台
互联网科技logo设计
互联网科技小额贷款
互联网科技汛
卓越科技互联网 招聘
衡水科技产业互联网平台
深圳前海聚择互联网科技有限公司
中国航天科技大学国际工业互联网
互联网科技与大数据专业
互联网科技研发水平
华夏恒生互联网科技013171
郑州欣桑互联网科技有限公司
科技互联网行业投资研究
如何强化互联网金融科技
科技互联网政务服务
平安科技 互联网
万易互联网科技有限公司
广州互联网络科技有限公司
北京禾田雨橡互联网科技
菲比寻常互联网科技
甘肃拓世互联网科技有限公司
科技大学互联网专业好不好
华脉科技工业互联网产品
广州梦谷互联网科技有限公司领导