您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Springboot+AOP怎么实现时间参数格式转换

2024/3/4 8:19:16发布18次查看
前言场景前端传过来的时间参数,我们后端自定义时间格式转化使用,想转成什么就转成什么。
不同业务场景,跟前端对接,一种控件基本时间参数是固定格式的,为了避免前端去转换时间参数的格式,跟前端约定好,让他们固定传递一种格式,后端自己看需求转换格式使用即可。
效果① 从 yyyy-mm-dd hh:mm:ss 转换成 yyyy-mm-dd 使用:
② 从 yyyymmddhhmmss 转换成 yyyy-mm-dd hh:mm:ss 使用:
③不再举例,其实就是自己想怎么转就怎么转。
实战pom.xml (aop依赖、lombok依赖):
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.18.20</version> <scope>compile</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-aspects</artifactid> <version>5.2.7.release</version> </dependency> <dependency> <groupid>org.aspectj</groupid> <artifactid>aspectjtools</artifactid> <version>1.9.5</version> </dependency> <dependency> <groupid>aopalliance</groupid> <artifactid>aopalliance</artifactid> <version>1.0</version> </dependency> <dependency> <groupid>org.aspectj</groupid> <artifactid>aspectjweaver</artifactid> <version>1.9.0</version> </dependency> <dependency> <groupid>cglib</groupid> <artifactid>cglib</artifactid> <version>3.3.0</version> </dependency>
核心(自定义注解+拦截器):
自定义注解一 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怎么实现时间参数格式转换的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product