前言
从数据库获取时间传到前端进行展示的时候,数据库中可能是正确的时间格式,但是如果显示到前端,却变成了一串时间戳。后端传入到前端可能需要某个格式,比如常见的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。
具体实现过程
首先我们需要定义一个注解@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);
}
}
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;
}
}
@DateFormatter
private Date updatedDate;
或者
@DateFormatter
public void getUpdateDate(){
return updateDate;
}