前言
场景
前端传过来的时间参数,我们后端自定义时间格式转化使用,想转成什么就转成什么。
不同业务场景,跟前端对接,一种控件基本时间参数是固定格式的,为了避免前端去转换时间参数的格式,跟前端约定好,让他们固定传递一种格式,后端自己看需求转换格式使用即可。
效果
① 从 yyyy-MM-dd HH:mm:ss 转换成 yyyy-MM-dd 使用:
② 从 yyyyMMddHHmmss 转换成 yyyy-MM-dd HH:mm:ss 使用:
③不再举例,其实就是自己想怎么转就怎么转。
实战
pom.xml (aop依赖、lombok依赖):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
< 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
用途: 用于标记哪个字段需要进行时间格式转换,配置旧格式,新格式(都可写默认值)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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方式 时间格式转换。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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
用途: 核心转换实现逻辑。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
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 @Component public 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
用途: 时间格式转换函数、定义各种时间格式。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import lombok.extern.slf4j.Slf4j; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;
/** * @Author: JCccc * @Date: 2022-4-1 14:48 * @Description: */ @Slf4j public 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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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: */ @Data public 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; } |
接口
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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: */ @RestController public 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实现时间参数格式转换的详细内容,更多关于Springboot时间格式转换的资料请关注其它相关文章!
原文链接:https://blog.csdn.net/qq_35387940/article/details/124488501
查看更多关于Springboot+AOP实现时间参数格式转换的详细内容...