1. 程式人生 > >Spring Boot(四):利用註解自定義日期格式化

Spring Boot(四):利用註解自定義日期格式化

在日期的格式化過程中,我們有時候需要將日期格式化到秒或者微妙,有時候又僅僅需要將日期格式化到日期,所以定義全域性的日期格式化肯定難以滿足需求,這時就需要一種更靈活的方法。

在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;
}

結論

通過使用註解,可以自定義日期的格式化樣式,降低型別轉換的工作量。