千家信息网

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安全错误 数据库的锁怎样保障安全 亿人帮互联网科技有限公司 互联网科技深圳 工业互联网科技新基建 互联网下的科技发展 壹账通互联网科技 佩信高科技互联网 西藏七维空间互联网科技有限公司 广州慧亚互联网科技怎么样 创业天下互联网科技有限公司 欧洲十大科技互联网公司 阿大互联网科技有限公司 速维有品互联网信息科技(苏州)有限公司 互联网新科技动漫ppt素材 迪庆互联网科技招生 锡山区互联网智能科技产品供应 梅州GM互联网络科技有限公司 上海创道互联网络科技有限公司 互联网科技年终奖 福州德业互联网科技 马化腾互联网科技教学 深圳市人人互联网科技有限公司 互联网科技有限公司经营范围 互联网科技与金融科技 新浪科技互联网 互联网科技网站 互联网经济与金融科技 河南猎农互联网科技有限公司 国大互联网教育科技有限公司工作 上海钢联属于互联网科技股吗 互联网科技年终奖
0