Spring 日期時間處理

1 Spring自身的支持

1.1 factory-bean

<bean id="dateFormat" class="java.text.SimpleDateFormat">
    <constructor-arg value="yyyy-MM-dd" />
</bean>
<bean  id="user" class="zxy.demo.springmvc.domain.UserInfo">
    <constructor-arg value="10" />
    <constructor-arg index="1" value="名字" />
    <constructor-arg index="2">
        <bean factory-bean="dateFormat" factory-method="parse">
            <constructor-arg value="2016-12-19" />
        </bean>
    </constructor-arg>
</bean>

做用於單個實體,用於xml文件配置。html

1.2 DateTimeFormat

這是一個註解,完整類名是org.springframework.format.annotation.DateTimeFormat,用於http請求入參,只能做用於具體的實體對象,以下java

@DateTimeFormat(pattern="yyyy-MM-dd")

1.3 InitBinder

只用於http請求入參,做用於全局,可搭配@Controller@ControllerAdvice使用,以下web

@ControllerAdvice
public class MyControllerAdvice {
    @InitBinder
    public void initDate(WebDataBinder binder) {
//      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH");
//      dateFormat.setLenient(false);
//      binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); // Spring 4.2以後的寫法
    }
}

1.4 conversion-service

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="zxy.demo.springmvc.converter.DateConverter"/>
        </set>
    </property>
</bean>

<mvc:annotation-driven conversion-service="conversionService"/>
public class DateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        // ...
    }
}

DateConverter是一個自定義類,實現接口org.springframework.core.convert.converter.Converter,重寫convert()方法便可。做用於全局,用於http請求入參spring


2 說明

前面說的日期處理,沒有一種是用於請求返回的,若是是要返回數據,而且使用json進行系列化的,那麼SpringMVC支持的有jackson跟Gson,具體要看引入了哪一個jar包,若是兩個引入了,那麼將以jackson爲準,具體可看org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser這個類,關鍵看兩個成員變量jackson2PresentgsonPresent,這是兩個boolean值,根據這兩個成員變量看關聯的代碼便可。json

:因爲通常接口返回的數據是json格式的,因此jackson跟Gson這兩個包確定是要引入一個的,否則請求會報錯,如「org.springframework.core.convert.ConversionFailedException: Failed to convert from type xxx to type xxx for ...」,這時候引入兩個包之中的一個就能夠讓對象序列化爲Json進行傳輸了。同理xml格式的序列化也可參考AnnotationDrivenBeanDefinitionParser這個類進行相應的配置。mvc

:下面的代碼是基於Spring 4.3.8.RELEASE,其餘版本應該也相似。app


3 jackson

3.1 JsonFormat

這是一個註解,完整類名是com.fasterxml.jackson.annotation.JsonFormat,只能用於http請求返回,只能做用於具體的實體對象,以下dom

@JsonFormat(pattern = "yyyy-MM-dd HH:mm")

3.2 message-converters

做用於全局,只用於請求返回ide

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" >
                <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" p:simpleDateFormat="yyyy-MM-dd HH:mm:ss" />
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

4 Gson

4.1 message-converters

做用於全局,只用於請求返回code

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.GsonHttpMessageConverter">
            <property name="gson">
                <bean class="org.springframework.http.converter.json.GsonFactoryBean" p:dateFormatPattern="yyyy-MM-dd HH:mm:ss" />
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

5 最後

若是做用域單個的跟做用於全局的都配置了,那麼配置單個實體的將最終生效而不會用全局的配置。

對於使用message-converters的方式,若是還須要更多的配置參數,能夠看spring-webmvc的AnnotationDrivenBeanDefinitionParser這個類跟spring-web的org.springframework.http.converter.json包下的類便可。

更多的日期時間處理方式,可參考官方文檔。


6 參考

  • http://docs.spring.io/spring/docs/4.3.8.RELEASE/spring-framework-reference/html/validation.html#format-CustomFormatAnnotations
  • http://docs.spring.io/spring/docs/4.3.8.RELEASE/spring-framework-reference/html/validation.html#core-convert-ConversionService-API
  • http://docs.spring.io/spring/docs/4.3.8.RELEASE/spring-framework-reference/html/mvc.html#mvc-config-conversion
  • http://docs.spring.io/spring/docs/4.3.8.RELEASE/spring-framework-reference/html/mvc.html#mvc-config-message-converters
相關文章
相關標籤/搜索