java 日期注解 xml_Spring Boot 四 利用注解自定义日期格式化

在日期的格式化过程中,我们有时候需要将日期格式化到秒或者微妙,有时候又仅仅需要将日期格式化到日期,所以定义全局的日期格式化肯定难以满足需求,这时就需要一种更灵活的方法。

在Spring Boot对JSON的处理类中,定义了annotationIntrospector属性,专用于处理注解,因此自定义日期格式化的步骤分为四步,如下:

1. 定义日期格式化注解,用于盛放格式化样式;

2. 定义日期JSON串行化化处理类;

3. 定义注解处理类;

4. 配置Spring容器;

1. 定义注解

此注解只需要知道日期格式化的样式即可,如“YYYY-MM-dd”,所以只需要一个配置属性即可,如下:

@Target( {ElementType.FIELD, ElementType.METHOD })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface DateFormatter {    //  用于储存日期格式化样式    String value() default "yyyy-MM-dd";}

1

2

3

4

5

6

7

8

9

2. 定义JSON串行化处理类

通过注解获取到了日期格式化样式,又有了日期的输入值,现在就可以进行JSON串行化了,如下;

public class DateTimeSerializer extends JsonSerializer {    //  用于储存日期串行化格式    private final String key;    /**     *@param key     */    public DateTimeSerializer(String key) {        super();        this.key = key;    }    /* (non-Javadoc)     * @see com.fasterxml.jackson.databind.JsonSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)     */    @Override    public void serialize(Date value, JsonGenerator jgen,            SerializerProvider provider)            throws IOException, JsonProcessingException {        String output = StringUtils.EMPTY;        if(value != null) {            //  将日期转换为字符串            output = new SimpleDateFormat(key).format(value);        }         //  输出转换结果        jgen.writeString(output);    }}

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

3. 定义注解处理类

JAVA对象转换JSON字符串的处理类ObjectMapper可以定义方法、属性的JSON转换过程,如下:

public class MyAnnotationIntrospector extends JacksonAnnotationIntrospector {    /* (non-Javadoc)     * @see com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector#findSerializer(com.fasterxml.jackson.databind.introspect.Annotated)     */    @Override    public Object findSerializer(Annotated annotated) {        //  经测试,只对方法有用        if(annotated instanceof AnnotatedMethod) {            DateFormatter formatter = annotated.getAnnotated().getAnnotation(DateFormatter.class);            if(formatter != null) {                return new DateTimeSerializer(formatter.value());            }        }        return super.findSerializer(annotated);    }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

在我的测试中,好像只对方法上的注解有效(即getter上的注解)。

4. 配置Spring容器

配置又分为两步,一是配置ObjectMapper,如下:

1

2

3

4

5

二是配置HTTP消息转换器,如下:

1

2

3

4

5

6

7

现在可以直接应用注解了,每个属性都可以格式化为不同的输出,如下:

//  默认的短格式@DateFormatterpublic Date getClient_time() {    return client_time;}//  更换为长格式@DateFormatter("yyyy-MM-dd HH:mm:ss")public Date getClient_time() {    return client_time;}

1

2

3

4

5

6

7

8

9

10

11

结论

通过使用注解,可以自定义日期的格式化样式,降低类型转换的工作量。

在日期的格式化过程中,我们有时候需要将日期格式化到秒或者微妙,有时候又仅仅需要将日期格式化到日期,所以定义全局的日期格式化肯定难以满足需求,这时就需要一种更灵活的方法。

在Spring Boot对JSON的处理类中,定义了annotationIntrospector属性,专用于处理注解,因此自定义日期格式化的步骤分为四步,如下:

1. 定义日期格式化注解,用于盛放格式化样式;

2. 定义日期JSON串行化化处理类;

3. 定义注解处理类;

4. 配置Spring容器;

1. 定义注解

此注解只需要知道日期格式化的样式即可,如“YYYY-MM-dd”,所以只需要一个配置属性即可,如下:

@Target( {ElementType.FIELD, ElementType.METHOD })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface DateFormatter {    //  用于储存日期格式化样式    String value() default "yyyy-MM-dd";}

1

2

3

4

5

6

7

8

9

2. 定义JSON串行化处理类

通过注解获取到了日期格式化样式,又有了日期的输入值,现在就可以进行JSON串行化了,如下;

public class DateTimeSerializer extends JsonSerializer {    //  用于储存日期串行化格式    private final String key;    /**     *@param key     */    public DateTimeSerializer(String key) {        super();        this.key = key;    }    /* (non-Javadoc)     * @see com.fasterxml.jackson.databind.JsonSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)     */    @Override    public void serialize(Date value, JsonGenerator jgen,            SerializerProvider provider)            throws IOException, JsonProcessingException {        String output = StringUtils.EMPTY;        if(value != null) {            //  将日期转换为字符串            output = new SimpleDateFormat(key).format(value);        }         //  输出转换结果        jgen.writeString(output);    }}

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

3. 定义注解处理类

JAVA对象转换JSON字符串的处理类ObjectMapper可以定义方法、属性的JSON转换过程,如下:

public class MyAnnotationIntrospector extends JacksonAnnotationIntrospector {    /* (non-Javadoc)     * @see com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector#findSerializer(com.fasterxml.jackson.databind.introspect.Annotated)     */    @Override    public Object findSerializer(Annotated annotated) {        //  经测试,只对方法有用        if(annotated instanceof AnnotatedMethod) {            DateFormatter formatter = annotated.getAnnotated().getAnnotation(DateFormatter.class);            if(formatter != null) {                return new DateTimeSerializer(formatter.value());            }        }        return super.findSerializer(annotated);    }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

在我的测试中,好像只对方法上的注解有效(即getter上的注解)。

4. 配置Spring容器

配置又分为两步,一是配置ObjectMapper,如下:

1

2

3

4

5

二是配置HTTP消息转换器,如下:

1

2

3

4

5

6

7

现在可以直接应用注解了,每个属性都可以格式化为不同的输出,如下:

//  默认的短格式@DateFormatterpublic Date getClient_time() {    return client_time;}//  更换为长格式@DateFormatter("yyyy-MM-dd HH:mm:ss")public Date getClient_time() {    return client_time;}

1

2

3

4

5

6

7

8

9

10

11

结论

通过使用注解,可以自定义日期的格式化样式,降低类型转换的工作量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值