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

解決jackson反序列化失敗InvalidFormatException:Can not deserialize value of type java.util.Date

 更新時間:2023年12月26日 17:07:08   作者:huangyaa729  
這篇文章主要介紹了解決jackson反序列化失敗InvalidFormatException:Can not deserialize value of type java.util.Date問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

今天調(diào)試接口的時候碰到了這個問題,String 轉(zhuǎn)Date類型時

反序列化失敗

caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException:
Can not deserialize value of type java.util.Date from String
“2018-12-25 10:07:49”: not a valid representation (error: Failed to
parse Date value ‘2018-12-25 10:07:49’: Can not parse date “2018-12-25
10:07:49Z”: while it seems to fit format
‘yyyy-MM-dd’T’HH:mm:ss.SSS’Z’’, parsing fails (leniency? null))

首先嘗試了 @DateTimeFormat注解,發(fā)現(xiàn)沒有效果,仍然報(bào)錯;

然后試了下@JsonFormat注解,接口正常;

在印象中,@DateTimeFormat是入?yún)r進(jìn)行數(shù)據(jù)格式化轉(zhuǎn)換,@JsonFormat是出參進(jìn)行格式話轉(zhuǎn)換,為啥突然不行了呢。

通過一番搜索,找到了如下解釋

一般都是使用@DateTimeFormat把傳給后臺的時間字符串轉(zhuǎn)成Date,使用@JsonFormat把后臺傳出的Date轉(zhuǎn)成時間字符串,但是@DateTimeFormat只會在類似@RequestParam的請求參數(shù)(url拼接的參數(shù)才生效,如果是放到RequestBody中的form-data也是無效的)上生效,如果@DateTimeFormat放到@RequestBody下是無效的。

在@RequestBody中則可以使用@JsonFormat把傳給后臺的時間字符串轉(zhuǎn)成Date,也就是說@JsonFormat其實(shí)既可以把傳給后臺的時間字符串轉(zhuǎn)成Date也可以把后臺傳出的Date轉(zhuǎn)成時間字符串。

至于為啥沒效果,沒有細(xì)說,從報(bào)錯的分析來看應(yīng)該是反序列話的方式不同,導(dǎo)致@DateTimeFormat注解不能生效。

另附原因與多種解決方式

原因

fastjson默認(rèn)使用的序列化格式:

public static String DEFFAULT_DATE_FORMAT = “yyyy-MM-dd
HH:mm:ss”;

jackson默認(rèn)支持的日期反序列格式:

(“yyyy-MM-dd'T'HH:mm:ss.SSSZ”, “yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”, “EEE,dd MMM yyyy HH:mm:ss zzz”, “yyyy-MM-dd”))

jackjson解析框架在解析實(shí)體類里面是date數(shù)據(jù)類型的數(shù)據(jù)時的默認(rèn)格式是:UTC類型,即yyyy-MM-dd’T’HH:mm:ss.SSS

并且默認(rèn)為+8時區(qū),即時間基礎(chǔ)上加8小時,

Springboot使用的默認(rèn)json解析框架是jackjson框架

解決辦法一

重寫jackson反序列化

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @version 1.0.0
 * @description 重寫反序列化
 * @date 2018/12/25 9:51
 **/

public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
@Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = jp.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
      }
    }

在需要的date屬性上添加注解:

@JsonDeserialize(using = CustomJsonDateDeserializer.class)
private Date txnTime;

使用這種方式,需要重寫上面反序列化抽象類

解決辦法二

使用@JsonFormat注解指定所需的接收格式,不需要重寫反序列化:

    //GMT+8表示時區(qū),東八區(qū),需加上時區(qū),shape 默認(rèn)是JsonFormat.Shape.ANY,
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date txnTime;

解決辦法三

如果排除了jackjson框架則使用fastjson注解,不要重寫反序列化

@JSONField(format = “yyyy-MM-dd HH:mm:ss”)
private Date txnTime;

需要添加的依賴:

    <!-- fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.32</version>
    </dependency>
    <!-- jackson-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.4</version>
    </dependency>

最后介紹一種全局修改接收時間格式的方式

用MappingJackson2HttpMessageConverter配置在Application.Java啟動類,指定接收格式,本人不推薦使用,因?yàn)檫@是全局性的,不是很靈活,因此了解即可

@Bean
    public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        //設(shè)置日期格式
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleDateFormat smt = new SimpleDateFormat("yyyy-MM-dd");
        objectMapper.setDateFormat(smt);
        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
        //設(shè)置中文編碼格式
        List<MediaType> list = new ArrayList<MediaType>();
        list.add(MediaType.APPLICATION_JSON_UTF8);
        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(list);
        return mappingJackson2HttpMessageConverter;
    }

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中的Set接口實(shí)現(xiàn)類HashSet和LinkedHashSet詳解

    Java中的Set接口實(shí)現(xiàn)類HashSet和LinkedHashSet詳解

    這篇文章主要介紹了Java中的Set接口實(shí)現(xiàn)類HashSet和LinkedHashSet詳解,Set接口和java.util.List接口一樣,同樣繼承自Collection接口,它與Collection接口中的方法基本一致,并沒有對Collection接口進(jìn)行功能上的擴(kuò)充,只是比Collection接口更加嚴(yán)格了,需要的朋友可以參考下
    2024-01-01
  • 詳解Java中的ThreadLocal

    詳解Java中的ThreadLocal

    ThreadLocal是JDK包提供的,它提供線程本地變量,如果創(chuàng)建一個ThreadLocal變量,那么訪問這個變量的每個線程都會有這個變量的一個副本,在實(shí)際多線程操作的時候,操作的是自己本地內(nèi)存中的變量,從而規(guī)避了線程安全問題
    2021-06-06
  • Java 日期與時間API相關(guān)用法總結(jié)

    Java 日期與時間API相關(guān)用法總結(jié)

    這篇文章主要介紹了Java 日期與時間API相關(guān)用法總結(jié),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • 喜大普奔IntelliJ IDEA 可以使用中文了

    喜大普奔IntelliJ IDEA 可以使用中文了

    IntelliJ Idea最大的亮點(diǎn)開始支持中文,很多英語不好的童鞋有福了,今天通過本文給大家分享如何開啟中文漢化,通過圖文步驟給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-05-05
  • sql于navicat中能運(yùn)行在mybatis中不能運(yùn)行的解決方案

    sql于navicat中能運(yùn)行在mybatis中不能運(yùn)行的解決方案

    這篇文章主要介紹了sql于navicat中能運(yùn)行在mybatis中不能運(yùn)行的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java synchronized關(guān)鍵字使用方式及特性解析

    Java synchronized關(guān)鍵字使用方式及特性解析

    這篇文章主要介紹了Java synchronized關(guān)鍵字使用方式及特性解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java8新特性之字符串去重介紹

    Java8新特性之字符串去重介紹

    這篇文章主要介紹了Java8新特性之字符串去重介紹,新的字符串去重特性可以幫助減少應(yīng)用中String對象的內(nèi)存占用,目前該特性只適用于G1垃圾收集器,并且默認(rèn)不被開啟,需要的朋友可以參考下
    2014-09-09
  • Spring中BeanFactory與FactoryBean接口的區(qū)別詳解

    Spring中BeanFactory與FactoryBean接口的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于Spring中BeanFactory與FactoryBean接口的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java如何獲取當(dāng)前時間的小時/分鐘(實(shí)現(xiàn)方法)

    Java如何獲取當(dāng)前時間的小時/分鐘(實(shí)現(xiàn)方法)

    文章介紹了Java獲取當(dāng)前時間的小時、分鐘等的方法,包括兩種常見方法,并鼓勵讀者繼續(xù)瀏覽相關(guān)文章,感興趣的朋友一起看看吧
    2025-02-02
  • Java判斷兩個集合是否具有交集及如何獲得交集詳解

    Java判斷兩個集合是否具有交集及如何獲得交集詳解

    這篇文章主要給大家介紹了關(guān)于Java判斷兩個集合是否具有交集及如何獲得交集的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07

最新評論