国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

解決報(bào)錯(cuò)InvalidDefinitionException Java 8 date/time type LocalDateTime not supported by default jsr310

這篇具有很好參考價(jià)值的文章主要介紹了解決報(bào)錯(cuò)InvalidDefinitionException Java 8 date/time type LocalDateTime not supported by default jsr310。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一. 報(bào)錯(cuò)信息

最近新開了一個(gè)測試項(xiàng)目,使用了Java8的LocalDateTime替換了之前使用的Date類。接口返回結(jié)果時(shí),拋出了序列化異常:

java.lang.reflect.UndeclaredThrowableException: null
…………
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: 
add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: 
cn.xx.dao.common.Back["data"]->cn.xx.dao.data.vo.BmVo["spe"]->
cn.xx.dao.entity.Spe["createTime"])





二. 版本信息

spring boot:2.5.1
jackson-databind:2.12.3

……
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.1</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
……
<dependencies>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.12.3</version>
          <scope>compile</scope>
      </dependency>
</dependencies>





三. 解決方法

1. 使用@JsonSerialize + @JsonDeserialize注解
  1. pom加上這兩個(gè)注解的依賴
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.12.3</version>
</dependency>
  1. 在使用LocalDateTime的屬性上添加這兩個(gè)序列化反序列化注解:
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime createTime;

這時(shí)序列化正常,接口返回了結(jié)果,但是很明顯不是我們需要的結(jié)果:

{
	"createTime": [
		2023,
		3,
		20,
		17,
		34,
		37
	]
}
  1. 加上@JsonFormat來格式化時(shí)間,現(xiàn)在就可以正常輸出了:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime createTime;

InvalidDefinitionException這個(gè)報(bào)錯(cuò),大部分博客提供的思路都是這個(gè),理論上沒什么問題,但是實(shí)際情況可能需要全局處理如LocalDateTime的時(shí)間格式,如果為相關(guān)的時(shí)間字段一個(gè)個(gè)的加注解,又太過麻煩。所以這種方法只能用于需要處理特定時(shí)間格式的字段上。



2. 回退Spring Boot版本

鑒于方法A只能作用于局部,而使用Jackson2ObjectMapperBuilderCustomizer時(shí),仍然無法解決InvalidDefinitionException這個(gè)異常問題,只能將Spring Boot回退至2.4.x版本,問題得到解決。
參考:Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 date/time type java.time.Instant not supported by default

解決流程:

  1. 設(shè)置Jackson2ObjectMapperBuilderCustomizer:
@Configuration
public class GlobalDateConfig {
	// 序列化時(shí)設(shè)置的時(shí)間格式
	private final String formatter = "yyyy-MM-dd HH:mm:ss";
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> {
            DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ofPattern(formatter);
            //返回時(shí)間數(shù)據(jù)序列化
            builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(localDateTimeFormatter));
            // 接收時(shí)間數(shù)據(jù)反序列化
            builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(localDateTimeFormatter));
        };
    }
}
  1. 回退Spring Boot版本至2.4.x
……
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.2</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
……
  1. 重啟執(zhí)行,問題解決



3. 回退jackson版本

Spring Boot 2.4.x使用的是jackson 2.11.x
Spring Boot 2.5.x使用的是jackson 2.12.x
參考:Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 date/time type java.time.Instant not supported by default

  1. 無須修改Spring Boot版本,并顯式的指定jackson版本(2.13也報(bào)這個(gè)錯(cuò)誤,原因可以參考這里:a change in Jackson 2.12、comment of 2.4 and 2.5)
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.11.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.11.2</version>
</dependency>
  1. 使用上文的GlobalDateConfig配置,重啟執(zhí)行,問題解決





四. 一些嘗試(未解決問題)

根據(jù)Spring Boot的討論和Stack overflow的一些解決方法做了一些嘗試,但是均未成功解決問題。

1. 向自定義ObjectMapper Bean中注冊JavaTimeModule

我的項(xiàng)目中,并不存在這種自定義ObjectMapper且將其設(shè)置為全局Bean的情況。

如果存在自定義ObjectMapper Bean的情況下,需要注冊處理java8時(shí)間序列化的類:JavaTimeModule(或者Jdk8Module)

@Bean
@Primary
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;
}

或者:

@Bean
@Primary
public ObjectMapper objectMapper() {
    return JsonMapper.builder()
            .addModule(new JavaTimeModule())
            .build();
}

或者

@Resource
private Jackson2ObjectMapperBuilder mapperBuilder;

@Bean
@Primary
public ObjectMapper objectMapper() {
    ObjectMapper build = mapperBuilder.build();
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;
}

這幾種情況沒遇到過,不知道是否可行??傊@里對我的代碼不起作用。
此外,JavaTimeModule還支持自定義格式

DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ofPattern(formatter);
// 添加Java8時(shí)間序列化反序列化
JavaTimeModule javaTimeModule = new JavaTimeModule();
//返回時(shí)間數(shù)據(jù)序列化
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(localDateTimeFormatter));
//接收時(shí)間數(shù)據(jù)反序列化
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(localDateTimeFormatter));



2. 設(shè)置Jackson2ObjectMapperBuilder類
  1. 設(shè)置Jackson2ObjectMapperBuilder類,控制序列化和反序列化操作。

很明顯,這個(gè)就是實(shí)現(xiàn)一個(gè)Jackson2ObjectMapperBuilderCustomizer類,與上文中的方法jackson2ObjectMapperBuilderCustomizer作用相同。這里也無法解決開頭的問題。

@Configuration
public class GlobalDateConfig implements Jackson2ObjectMapperBuilderCustomizer {
    private final String formatter = "yyyy-MM-dd HH:mm:ss";
    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder.simpleDateFormat(formatter)
                .modules(new JavaTimeModule())
                .serializationInclusion(JsonInclude.Include.ALWAYS)
                .failOnEmptyBeans(false)
                .failOnUnknownProperties(false)
                .featuresToEnable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN)
                .featuresToEnable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
    }
}



參考

Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 date/time type java.time.Instant not supported by default
文章來源地址http://www.zghlxwxcb.cn/news/detail-560938.html

到了這里,關(guān)于解決報(bào)錯(cuò)InvalidDefinitionException Java 8 date/time type LocalDateTime not supported by default jsr310的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 已解決JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String

    已解決JSON parse error: Cannot deserialize value of type java.time.LocalDateTime from String 下滑查看解決方法 JSON parse error: Cannot deserialize value of type java.time.LocalDateTime from String 這個(gè)問題通常出現(xiàn)在將一個(gè)字符串轉(zhuǎn)換為LocalDateTime對象時(shí)。 下滑查看解決方法 解決這個(gè)問題的方法取決于你使用的

    2024年02月08日
    瀏覽(34)
  • Java 8 datetime type `java.time.LocalDateTime` not supported by default add Module com.fasterxml.jac

    之前的項(xiàng)目好好的,突然報(bào)Java 8 date/time type java.time.LocalDateTime not supported by default: add Module “com.fasterxml.jackson.datatype:jackson-datatype-jsr310” to enable handling錯(cuò)誤, 原因是之前基本上沒有涉及LocalDateTime相關(guān)的代碼所有問題一直沒有發(fā)現(xiàn),我們使用springboot的默認(rèn)的jackson序列化,也沒

    2024年01月21日
    瀏覽(28)
  • SpringBoot報(bào)錯(cuò)java.time.LocalDateTime cannot be cast to java.sql.Timestamp] with root cause

    最近在做系統(tǒng)升級,原本的版本為 SpringBoot2.1.8RELEASE ,升級后版本為 SpringBoot2.7.0 升級后原代碼報(bào)錯(cuò)java.time.LocalDateTime cannot be cast to java.sql.Timestamp] with root cause。 經(jīng)檢查,原代碼部分?jǐn)?shù)據(jù)使用Map接收數(shù)據(jù)庫返回?cái)?shù)據(jù),使用Map.get()取出 Object 對象后強(qiáng)制轉(zhuǎn)化為了 Date 類型。 升級

    2023年04月08日
    瀏覽(17)
  • Java8 掌握Date與Java.time轉(zhuǎn)換的核心思路,輕松解決各種時(shí)間轉(zhuǎn)換問題

    Java8時(shí)區(qū)時(shí)間運(yùn)用詳解,2萬字助你通關(guān)java.time包 各種時(shí)間類的轉(zhuǎn)換核心只有一個(gè)流程: 時(shí)間類 - 時(shí)間戳 - 時(shí)間類 Date和Instant它們存儲的都是時(shí)間戳信息 LocalDateTime、LocalDate、LocalTime、ZonedDateTime、OffsetDateTime、OffsetTime、Year等其它Java8時(shí)間類則是 年、月、日、時(shí)、分、秒、納秒

    2024年02月02日
    瀏覽(21)
  • java~Date和LocalDateTime及Instant的使用場景

    在 Java 中, LocalDateTime 、 Date 和 Instant 分別代表了不同的日期時(shí)間類型,它們之間有一些區(qū)別和適用場景。 Date : java.util.Date 是 Java 早期的日期時(shí)間類,它包含了日期和時(shí)間信息,但是在設(shè)計(jì)上存在一些問題,因此并不推薦在新的代碼中使用。 Date 類存在線程安全性問題,同

    2024年02月21日
    瀏覽(17)
  • Java中Date、Calendar、LocalDateTime時(shí)間戳轉(zhuǎn)換日期

    時(shí)間戳是指格林威治時(shí)間 1970 年 01 月 01 日 00 時(shí) 00 分 00 秒 ( 北京時(shí)間 1970 年 01 月 01 日 08 時(shí) 00 分 00 秒 ) 起至現(xiàn)在的總毫秒數(shù),本質(zhì)是一個(gè)long 類型的整數(shù),表示日期對象。 以下時(shí)Java中Date、Calendar、LocalDateTime與時(shí)間戳轉(zhuǎn)換日期 Date類時(shí)間戳轉(zhuǎn)換日期: Calendar類時(shí)間戳轉(zhuǎn)換日

    2024年02月11日
    瀏覽(31)
  • Java String、Date、Calendar、LocalDate和LocalDateTime互轉(zhuǎn)

    目錄 一、String和Date互轉(zhuǎn) 1.1 String時(shí)間轉(zhuǎn)為Date 1.2 Date轉(zhuǎn)為String 二、String和Calendar互轉(zhuǎn) 2.1 String時(shí)間轉(zhuǎn)為Calendar 2.2 Calendar轉(zhuǎn)為String 三、String和LocalDate(LocalDateTime)互轉(zhuǎn) 3.1 String時(shí)間轉(zhuǎn)為LocalDate(LocalDateTime) 3.2 LocalDate(LocalDateTime)轉(zhuǎn)為String 四、Date和Calendar互轉(zhuǎn) 4.1 Date轉(zhuǎn)為Calen

    2024年02月06日
    瀏覽(33)
  • Java中LocalDateTime/DateTime與Date相互轉(zhuǎn)化(java中時(shí)間轉(zhuǎn)化)

    LocalDateTime是JDK1.8出現(xiàn)的新特性,解決線程不安全的問題,但是當(dāng)前很多的相關(guān)插件或者使用較低版本的時(shí)候,會依舊使用Date的情況,這個(gè)時(shí)候就需要兩者之間的相互轉(zhuǎn)化 新增的API嚴(yán)格區(qū)分了時(shí)刻、本地日期、本地時(shí)間,并且,對日期和時(shí)間進(jìn)行運(yùn)算更加方便。 其次,新AP

    2024年02月15日
    瀏覽(26)
  • java關(guān)于后端怎么去接收Date、LocalDateTime類型的參數(shù)

    Date類型后端入?yún)⒌母袷侥J(rèn)為2019/01/18 11:11:11 Get方式傳參 是 沒有時(shí)區(qū)的影響的 @JsonFormat的作用: 返回給前端的時(shí)間是經(jīng)過@JsonFormat格式化的時(shí)間。 @DateTimeFormat的作用: 前端需要按照@DateTimeForma的格式進(jìn)行傳參 示例: Date 類型直接作為參數(shù)的情況 Date類型屬性的實(shí)體類作為參

    2024年02月05日
    瀏覽(20)
  • java中LocalDateTime、Calendar、Date三種時(shí)間類型進(jìn)行加減

    java中LocalDateTime、Calendar、Date三種時(shí)間類型進(jìn)行加減

    介紹了三種日期類型以及他們的日期加減 什么是LocalDateTime LocalDateTime是Java 8中的一個(gè)類,表示不帶時(shí)區(qū)的日期和時(shí)間。它是java.time包中的一個(gè)類,用于處理日期和時(shí)間的操作。 LocalDateTime包含日期和時(shí)間的信息,不包含時(shí)區(qū)信息。它提供了各種方法來獲取和操作日期和時(shí)間的

    2024年02月04日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包