Spring Boot(四):利用註解自定義日期格式化
阿新 • • 發佈:2019-01-09
在日期的格式化過程中,我們有時候需要將日期格式化到秒或者微妙,有時候又僅僅需要將日期格式化到日期,所以定義全域性的日期格式化肯定難以滿足需求,這時就需要一種更靈活的方法。
在Spring Boot對JSON的處理類中,定義了annotationIntrospector屬性,專用於處理註解,因此自定義日期格式化的步驟分為四步,如下:
1. 定義日期格式化註解,用於盛放格式化樣式;
2. 定義日期JSON序列化化處理類;
3. 定義註解處理類;
4. 配置Spring容器;
1. 定義註解
此註解只需要知道日期格式化的樣式即可,如“YYYY-MM-dd”,所以只需要一個配置屬性即可,如下:
@Target( {ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DateFormatter {
// 用於儲存日期格式化樣式
String value() default "yyyy-MM-dd";
}
2. 定義JSON序列化處理類
通過註解獲取到了日期格式化樣式,又有了日期的輸入值,現在就可以進行JSON序列化了,如下;
public class DateTimeSerializer extends JsonSerializer<Date> {
// 用於儲存日期序列化格式
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);
}
}
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);
}
}
在我的測試中,好像只對方法上的註解有效(即getter上的註解)。
4. 配置Spring容器
配置又分為兩步,一是配置ObjectMapper,如下:
<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="annotationIntrospector">
<bean class="com.mirana.json.MyAnnotationIntrospector"/>
</property>
</bean>
二是配置HTTP訊息轉換器,如下:
<mvc:annotation-driven validator="validator">
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="objectMapper"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
現在可以直接應用註解了,每個屬性都可以格式化為不同的輸出,如下:
// 預設的短格式
@DateFormatter
public Date getClient_time() {
return client_time;
}
// 更換為長格式
@DateFormatter("yyyy-MM-dd HH:mm:ss")
public Date getClient_time() {
return client_time;
}
結論
通過使用註解,可以自定義日期的格式化樣式,降低型別轉換的工作量。