好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

前言

场景

前端传过来的时间参数,我们后端自定义时间格式转化使用,想转成什么就转成什么。

不同业务场景,跟前端对接,一种控件基本时间参数是固定格式的,为了避免前端去转换时间参数的格式,跟前端约定好,让他们固定传递一种格式,后端自己看需求转换格式使用即可。

效果

① 从 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实现时间参数格式转换的详细内容...

  阅读:20次