自定义注解格式化日期,实现@JsonFormat的功能

  1. 前言
    从数据库获取时间传到前端进行展示的时候,数据库中可能是正确的时间格式,但是如果显示到前端,却变成了一串时间戳。后端传入到前端可能需要某个格式,比如常见的yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss,我们经常使用的注解有@JsonFormat 和@JSONField。@JsonFormat每次使用都需要定义好具体的格式(pattern),比如:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createdDate;,@JsonField也是一样,实话实话,很麻烦,所以打算自己自定义一个@DateFormatter。

  2. 具体实现过程
    首先我们需要定义一个注解@DateFormatter。@Target中注明可以写在方法上以及属性上。

import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DateFormatter {

    String pattern() default "yyyy-MM-dd HH:mm:ss";

}
	定义一个DateSerializer Class 
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.util.Date;

public class DateSerializer extends JsonSerializer<Date> {

    private final String pattern;

    public DateSerializer(String pattern) {
        super();
        this.pattern = pattern;
    }

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        String output = StringUtils.EMPTY;
        if (date != null) {
            output = new SimpleDateFormat(pattern).format(date);
        }
        jsonGenerator.writeString(output);
    }
}
	DateFormatter格式化日期功能的具体实现
import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;

public class DateFormatterAnnotationIntrospector extends JacksonAnnotationIntrospector {

    private static final long serialVersionUID = 7368707128625539909L;

    @Override
    public Object findSerializer(Annotated annotated) {
        DateFormatter formatter = annotated.getAnnotation(DateFormatter.class);
        if (formatter != null) {
            return new DateSerializer(formatter.pattern());
        }
        return super.findSerializer(annotated);
    }
}
  1. 加入配置
import com.fasterxml.jackson.databind.ObjectMapper;
import com.stream.am.annotation.DateFormatterAnnotationIntrospector;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.nio.charset.StandardCharsets;
import java.util.TimeZone;

@Configuration
public class WebServerConfig {

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        // Config the Json convert Chinese garbled.
        // 这里的配置可能会导致application.properties文件中spring.jackson.time-zone=GMT+8失效
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

		// 不设置Utf-8格式,可能会导致Mock测试输出信息乱码
        converter.setDefaultCharset(StandardCharsets.UTF_8);

        ObjectMapper objectMapper = converter.getObjectMapper();
        objectMapper.setTimeZone(TimeZone.getDefault());
        objectMapper.setAnnotationIntrospector(new DateFormatterAnnotationIntrospector());
        return converter;
    }
}
  1. 使用
    在属性上加入注解就可以使用,会将输出到前端的日期数据自动格式化。
    可以加在方法上,也可以加在属性上。
    @DateFormatter
    private Date updatedDate;
	或者
    @DateFormatter
    public void getUpdateDate(){
    	return updateDate;
    }

你可能感兴趣的:(自定义注解格式化日期,实现@JsonFormat的功能)