欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決SpringMVC 返回Java8 時間JSON數(shù)據(jù)的格式化問題處理

 更新時間:2017年02月11日 14:57:35   作者:東小邪  
本篇文章主要介紹了解決SpringMVC 返回Java8 時間JSON數(shù)據(jù)的格式化問題處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

有時在Spring MVC中返回JSON格式的response的時候會使用@ResponseBody注解,不過在處理java8中時間的時候會很麻煩,一般我們使用的HTTPMessageConverter是MappingJackson2HttpMessageConverter,它默認返回的時間格式是這種:

"startDate" : {
  "year" : 2010,
  "month" : "JANUARY",
  "dayOfMonth" : 1,
  "dayOfWeek" : "FRIDAY",
  "dayOfYear" : 1,
  "monthValue" : 1,
  "hour" : 2,
  "minute" : 2,
  "second" : 0,
  "nano" : 0,
  "chronology" : {
   "id" : "ISO",
   "calendarType" : "iso8601"
  }
 }

但是我們不會返回這種給前端使用,針對LocalDate想要返回的格式是2016-11-26,而LocalDateTime想要返回的格式是2016-11-26 21:04:34這樣的數(shù)據(jù)。通過項目研究并查閱相關資料,這里介紹下個人研究中實現(xiàn)的兩種方式。

解決方法一:

若是maven項目,在pom中引入下面的jar包:

<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.8.5</version>
 </dependency>

然后在你想要JSON化的POJO字段的get函數(shù)上加上一個@JsonSerializer注解,如下

import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public LocalDateTime getBirthday() {
    return this.loginTime;
  }

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
public LocalDateTime getLastLoginTime() {
    return this.loginTime;
  }

這種方式的優(yōu)點是可以針對具體域類型設置不同顯示方式,然而優(yōu)點也是缺點,因為每個日期屬性都要手動添加,實際中日期屬性又是普遍必備,并且需要額外引入jsr310的jar包。

解決方法二:

繼承ObjectMapper來實現(xiàn)返回json字符串。MappingJackson2HttpMessageConverter主要通過ObjectMapper來實現(xiàn)返回json字符串。這里我們編寫一個JsonUtil類,獲取ObjectMapper以針對java8中新的日期時間API,注冊相應的JsonSerializer<T>。

/**
 * json處理工具類
 * 
 * 
 */
@Component
public class JsonUtil {

  private static final ObjectMapper mapper;

  public ObjectMapper getMapper() {
    return mapper;
  }

  static {

    mapper = new ObjectMapper();

    SimpleModule module = new SimpleModule();
    module.addSerializer(LocalDate.class, new LocalDateSerializer());
    module.addSerializer(LocalTime.class, new LocalTimeSerializer());
    module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
    mapper.registerModule(module);
  }

  public static String toJson(Object obj) {
    try {
      return mapper.writeValueAsString(obj);
    } catch (Exception e) {
      throw new RuntimeException("轉換json字符失敗!");
    }
  }

  public <T> T toObject(String json, Class<T> clazz) {
    try {
      return mapper.readValue(json, clazz);
    } catch (IOException e) {
      throw new RuntimeException("將json字符轉換為對象時失敗!");
    }
  }
}

class LocalDateSerializer extends JsonSerializer<LocalDate> {

  private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

  @Override
  public void serialize(LocalDate value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(dateFormatter.format(value));
  }
}

class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {

  private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

  @Override
  public void serialize(LocalDateTime value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(dateTimeFormatter.format(value));
  }

}

class LocalTimeSerializer extends JsonSerializer<LocalTime> {

  private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");

  @Override
  public void serialize(LocalTime value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(timeFormatter.format(value));

  }

}

然后在springmvc的配置文件中,再將<mvc:annotation-driven/>改為以下配置,配置一個新的json轉換器,將它的ObjectMapper對象設置為JsonUtil中的objectMapper對象,此轉換器比spring內置的json轉換器優(yōu)先級更高,所以與json有關的轉換,spring會優(yōu)先使用它。

<mvc:annotation-driven>
    <mvc:message-converters>
      <bean
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="objectMapper" value="#{jsonUtil.mapper}" />
        <property name="supportedMediaTypes">
          <list>
            <value>application/json;charset=UTF-8</value>
          </list>
        </property>
      </bean>
    </mvc:message-converters>
  </mvc:annotation-driven>

然后java8中的幾種日期和時間類型就可以正常友好的顯示了。優(yōu)點是全局統(tǒng)一管理日期和時間等類型,缺點對pojo中的某個域做特殊處理。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java使用Collections.sort()排序的方法

    Java使用Collections.sort()排序的方法

    這篇文章介紹了Java使用Collections.sort()排序的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • Kotlin與java8的SAM轉換對比(進階)

    Kotlin與java8的SAM轉換對比(進階)

    這篇文章主要介紹了Kotlin與java8的SAM轉換對比,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • JavaEE實現(xiàn)前后臺交互的文件上傳與下載

    JavaEE實現(xiàn)前后臺交互的文件上傳與下載

    這篇文章主要介紹了JavaEE實現(xiàn)前后臺交互的文件上傳與下載,分享相關技術,實現(xiàn)文件上傳下載功能,需要的朋友可以參考下
    2015-11-11
  • Java Web實現(xiàn)添加定時任務的方法示例

    Java Web實現(xiàn)添加定時任務的方法示例

    這篇文章主要介紹了Java Web實現(xiàn)添加定時任務的方法,涉及java web定時任務控制類定義、調用及監(jiān)聽器定義、添加等相關操作技巧,需要的朋友可以參考下
    2018-01-01
  • Java CyclicBarrier源碼層分析與應用

    Java CyclicBarrier源碼層分析與應用

    這篇文章主要介紹了Java CyclicBarrier的源碼層分析與應用,CyclicBarrier也叫同步屏障,可以讓一組線程達到一個屏障時被阻塞,直到最后一個線程達到屏障,感興趣的的朋友可以參考下
    2023-12-12
  • java使用動態(tài)代理來實現(xiàn)AOP(日志記錄)的實例代碼

    java使用動態(tài)代理來實現(xiàn)AOP(日志記錄)的實例代碼

    AOP(面向方面)的思想,就是把項目共同的那部分功能分離開來,比如日志記錄,避免在業(yè)務邏輯里面夾雜著跟業(yè)務邏輯無關的代碼
    2013-09-09
  • 談談對Java中的volatile的理解

    談談對Java中的volatile的理解

    這篇文章主要介紹了對Java中的volatile的理解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 解析Java設計模式編程中命令模式的使用

    解析Java設計模式編程中命令模式的使用

    這篇文章主要介紹了Java設計模式編程中命令模式的使用,在一些處理請求響應的場合經(jīng)??梢杂玫矫钅J降木幊趟悸?需要的朋友可以參考下
    2016-02-02
  • java多線程編程之Synchronized塊同步方法

    java多線程編程之Synchronized塊同步方法

    這篇文章主要介紹了java多線程編程之Synchronized塊同步方法,synchronized關鍵字又稱同步鎖,當方法執(zhí)行完后,會自動釋放鎖鎖,只有一個線程能進入此方法,看看下文中各種例子對synchronized的詳細解釋
    2015-12-12
  • Spring?Boot項目獲取resources目錄下文件并返回給前端的方案

    Spring?Boot項目獲取resources目錄下文件并返回給前端的方案

    我們在項目中經(jīng)常碰到需要讀取固定文件的場景,如模板文件,一般做法是將文件放在resources目錄下,程序通過多種方式可以順利讀取文件,這篇文章主要給大家介紹了關于Spring?Boot項目獲取resources目錄下文件并返回給前端的相關資料,需要的朋友可以參考下
    2024-07-07

最新評論