最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

反序列化失敗

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)沒(méi)有效果,仍然報(bào)錯(cuò);

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

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

通過(guò)一番搜索,找到了如下解釋

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

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

至于為啥沒(méi)效果,沒(méi)有細(xì)說(shuō),從報(bào)錯(cuò)的分析來(lái)看應(yīng)該是反序列話(huà)的方式不同,導(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í)體類(lèi)里面是date數(shù)據(jù)類(lèi)型的數(shù)據(jù)時(shí)的默認(rèn)格式是:UTC類(lèi)型,即yyyy-MM-dd’T’HH:mm:ss.SSS

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

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

解決辦法一

重寫(xiě)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 重寫(xiě)反序列化
 * @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;

使用這種方式,需要重寫(xiě)上面反序列化抽象類(lèi)

解決辦法二

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

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

解決辦法三

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

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

需要添加的依賴(lài):

    <!-- 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>

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

用MappingJackson2HttpMessageConverter配置在Application.Java啟動(dòng)類(lèi),指定接收格式,本人不推薦使用,因?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é)

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

相關(guān)文章

  • Spring?Cloud?OpenFeign模版化客戶(hù)端搭建過(guò)程

    Spring?Cloud?OpenFeign模版化客戶(hù)端搭建過(guò)程

    OpenFeign是一個(gè)顯示聲明式的WebService客戶(hù)端。使用OpenFeign能讓編寫(xiě)Web Service客戶(hù)端更加簡(jiǎn)單,這篇文章主要介紹了Spring?Cloud?OpenFeign模版化客戶(hù)端,需要的朋友可以參考下
    2022-06-06
  • SpringBoot中集成串口通信的項(xiàng)目實(shí)踐

    SpringBoot中集成串口通信的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot中集成串口通信,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Java中ArrayList與順序表示例詳解

    Java中ArrayList與順序表示例詳解

    順序表是在計(jì)算機(jī)內(nèi)存中以數(shù)組的形式保存的線(xiàn)性表,是指用一組地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線(xiàn)性結(jié)構(gòu),這篇文章主要介紹了Java中ArrayList與順序表的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-12-12
  • 淺析java中next與nextLine用法對(duì)比

    淺析java中next與nextLine用法對(duì)比

    這篇文章主要介紹了java中next與nextLine用法區(qū)別以及實(shí)例分析了他們的區(qū)別,需要的朋友可以參考下
    2017-04-04
  • @FeignClient的使用和Spring?Boot的版本適配方式

    @FeignClient的使用和Spring?Boot的版本適配方式

    這篇文章主要介紹了@FeignClient的使用和Spring?Boot的版本適配方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Windows中使用Java生成Excel文件并插入圖片的方法

    Windows中使用Java生成Excel文件并插入圖片的方法

    這篇文章主要介紹了Windows中使用Java生成Excel文件并插入圖片的方法,其中向Excel中插入圖片文中通過(guò)使用Apache POI來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2016-02-02
  • Idea創(chuàng)建springboot不能選擇java8的解決

    Idea創(chuàng)建springboot不能選擇java8的解決

    在IDEA 2023版本創(chuàng)建Spring Boot項(xiàng)目時(shí),發(fā)現(xiàn)沒(méi)有Java 8選項(xiàng),只有Java 17和Java 20,解決方法包括:通過(guò)修改服務(wù)器URL(推薦)或直接在創(chuàng)建后修改pom.xml文件中的Spring Boot和Java版本
    2025-01-01
  • Java代碼實(shí)現(xiàn)對(duì)properties文件有序的讀寫(xiě)的示例

    Java代碼實(shí)現(xiàn)對(duì)properties文件有序的讀寫(xiě)的示例

    本篇文章主要介紹了Java代碼實(shí)現(xiàn)對(duì)properties文件有序的讀寫(xiě)的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • scala 匿名函數(shù)案例詳解

    scala 匿名函數(shù)案例詳解

    Scala支持一級(jí)函數(shù),函數(shù)可以用函數(shù)文字語(yǔ)法表達(dá),即(x:Int)=> x + 1,該函數(shù)可以由一個(gè)叫作函數(shù)值的對(duì)象來(lái)表示,這篇文章主要介紹了scala 匿名函數(shù)詳解,需要的朋友可以參考下
    2023-03-03
  • Spring-cloud-eureka使用feign調(diào)用服務(wù)接口

    Spring-cloud-eureka使用feign調(diào)用服務(wù)接口

    這篇文章主要為大家詳細(xì)介紹了Spring-cloud-eureka使用feign調(diào)用服務(wù)接口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評(píng)論

临沧市| 东海县| 长寿区| 灵寿县| 珠海市| 扶余县| 天全县| 永川市| 本溪| 平南县| 南通市| 乌兰浩特市| 开阳县| 鹤庆县| 张北县| 隆子县| 沧州市| 贵港市| 房产| 安溪县| 东方市| 宁河县| 昂仁县| 徐汇区| 边坝县| 始兴县| 宁国市| 长治市| 特克斯县| 巴中市| 满洲里市| 武定县| 广安市| 遵化市| 乐安县| 陕西省| 静安区| 资兴市| 武川县| 鲁山县| 叙永县|