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

一篇文章了解Jackson注解@JsonFormat及失效解決辦法

 更新時(shí)間:2023年11月20日 09:51:27   作者:三省同學(xué)  
這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章了解Jackson注解@JsonFormat及失效解決辦法的相關(guān)資料,@JsonFormat注解是一個(gè)時(shí)間格式化注解,用于格式化時(shí)間,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

背景

項(xiàng)目中使用WRITE_DATES_AS_TIMESTAMPS: true轉(zhuǎn)換日期格式為時(shí)間戳未生效。如下:

spring:
  jackson:
    time-zone: Asia/Shanghai
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: true

嘗試是否關(guān)于時(shí)間的注解是否會(huì)生效,使用@JsonForma@JsonFiled均失效。

常見(jiàn)失效原因及解決方法

@JsonFormat是用于指定Java對(duì)象序列化為JSON字符串時(shí)的格式化方式的注解。如果@JsonFormat失效,可能是以下原因:

未正確導(dǎo)入Jackson庫(kù)

注解位置不正確

注解參數(shù)設(shè)置錯(cuò)誤

解決方法:

  • 確認(rèn)是否正確導(dǎo)入了Jackson庫(kù),可以在pom.xml文件中添加以下依賴(lài):
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

2、確認(rèn)注解位置是否正確,例如:

public class User {
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    // ...
}

3、確認(rèn)注解參數(shù)是否正確設(shè)置,例如:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
public Date getCreatedDate() {
    return createdDate;
}

以上是常見(jiàn)的解決方法,如果還有問(wèn)題可以提供更具體的錯(cuò)誤信息進(jìn)行排查。

本次問(wèn)題解決

失效原因

因?yàn)轫?xiàng)目中使用了Gson替換Jackson。代碼如下:

import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import springfox.documentation.spring.web.json.Json;

import java.lang.reflect.Type;

public class JsonToGson implements JsonSerializer<Json> {
    @Override
    public JsonElement serialize(Json json, Type type, JsonSerializationContext context) {
        return JsonParser.parseString(json.value());
    }
}
@Configuration
public class SwaggerWebConfiguration implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof MappingJackson2HttpMessageConverter);
        converters.add(gsonHttpMessageConverters());
    }

    @Bean
    public GsonHttpMessageConverter gsonHttpMessageConverters() {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Json.class, new SpringfoxJsonToGsonAdapter())
                .create();
        GsonHttpMessageConverter gsonConverter = new GsonHttpMessageConverter(gson);
        return gsonConverter;
    }
}

解決方案一:去掉Gson轉(zhuǎn)換即可。

解決方案二:重新添加MappingJackson2HttpMessageConverter的bean

@Autowired(required = false)
private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
    if (Objects.isNull(mappingJackson2HttpMessageConverter)) {
        converters.add(0, new MappingJackson2HttpMessageConverter());
    } else {
        converters.add(0, mappingJackson2HttpMessageConverter);
    }
}

@Autowired(required = false)
private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
    if (Objects.isNull(mappingJackson2HttpMessageConverter)) {
        converters.add(0, new MappingJackson2HttpMessageConverter());
    } else {
        converters.add(0, mappingJackson2HttpMessageConverter);
    }
}

解析

Jackson一直是springframework默認(rèn)的json庫(kù),從4.1開(kāi)始,springframework支持通過(guò)配置GsonHttpMessageConverter的方式使用Gson。

Spring MVC中,一旦請(qǐng)求退出@Controller,它將尋找一個(gè)視圖來(lái)呈現(xiàn)。當(dāng)指定了@RequestBody@RestController時(shí),我們會(huì)告訴Spring跳過(guò)這一步,將java對(duì)象通過(guò)model寫(xiě)入響應(yīng)結(jié)果。Spring通過(guò)HttpMessageConverter來(lái)執(zhí)行Java對(duì)象向其它類(lèi)型(通常是Json)的轉(zhuǎn)換,Spring默認(rèn)使用的是 MappingJackson2HttpMessageConverter,所以如果希望使用Gson來(lái)執(zhí)行這種轉(zhuǎn)換,可用使用GsonHttpMessageConverter替換Jackson。

小拓展

在Spring Boot提供了與三個(gè)JSON映射庫(kù)的集成:Gson、默認(rèn)庫(kù) Jackson 、JSON-B

@JsonFormat與@JSONField簡(jiǎn)介

@JsonFormat

@JsonFormat是Java中的一個(gè)Jackson注解,用于指定某個(gè)字段或?qū)傩?,或整個(gè)類(lèi)的JSON序列化或反序列化格式。它允許在將數(shù)據(jù)類(lèi)型轉(zhuǎn)換為或從JSON格式轉(zhuǎn)換時(shí)自定義日期、數(shù)字、布爾值等數(shù)據(jù)類(lèi)型的格式。

例如,如果您有一個(gè)Java類(lèi),其中包含一個(gè)Date字段,您希望以特定格式將其序列化為JSON,您可以使用@JsonFormat注解來(lái)指定該格式:

示例如下:Jackson在序列化或反序列化myDate字段時(shí)使用“yyyy-MM-dd”格式。

public class MyClass {
  @JsonFormat(pattern="yyyy-MM-dd")
  private Date myDate;
  // ...
}

@JSONField

@JSONField是阿里巴巴的fastjson庫(kù)中的一個(gè)注解,用于指定Java對(duì)象屬性在序列化為JSON字符串時(shí)的名稱(chēng)、順序、格式等信息。例如,可以使用@JSONField(name=“username”)指定Java對(duì)象屬性在序列化為JSON字符串時(shí)使用"username"作為屬性名。

區(qū)別

@JsonFormat和@JSONField都是用于控制Java對(duì)象屬性在序列化為JSON字符串時(shí)的格式,但是它們有一些不同之處。

@JsonFormat是Jackson庫(kù)中的一個(gè)注解,用于指定Java對(duì)象屬性在序列化為JSON字符串時(shí)的日期、時(shí)間、數(shù)字等格式。例如,可以使用@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”)指定Java對(duì)象屬性在序列化為JSON字符串時(shí)使用指定的日期時(shí)間格式。

@JSONField是阿里巴巴的fastjson庫(kù)中的一個(gè)注解,用于指定Java對(duì)象屬性在序列化為JSON字符串時(shí)的名稱(chēng)、順序、格式等信息。例如,可以使用@JSONField(name=“username”)指定Java對(duì)象屬性在序列化為JSON字符串時(shí)使用"username"作為屬性名。

因此,雖然@JsonFormat和@JSONField都可以用于控制Java對(duì)象屬性在序列化為JSON字符串時(shí)的格式,但是它們的作用范圍和使用方式略有不同。

jackson自定義日期注解

依賴(lài)HttpMessageConverter默認(rèn)實(shí)現(xiàn)如下:

jackson:MappingJackson2HttpMessageConverter;

gson:GsonHttpMessageConverter;

fastjson : FastJsonHttpMessageConverter

1、自定義轉(zhuǎn)換類(lèi):

public class DateToJsonSerializer extends JsonSerializer<Date> implements ContextualSerializer {

    private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public DateToJsonSerializer() {
    }

    @Override
    public void serialize(Date arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
        if (null != arg0) {
            arg1.writeString(this.df.format(arg0));
        }
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)   {
        AnnotationMap annotated = property.getMember().getAllAnnotations();

        JsonFormat jsonFormat = annotated.get(JsonFormat.class);
        if (jsonFormat != null && jsonFormat.pattern() != null){
            df = new SimpleDateFormat(jsonFormat.pattern());
        }
        return this;
    }
}

2、使用

public class MyClass {
  @JsonSerialize(using = DateToJsonSerializer .class)
  private Date myDate;
  // ...
}

總結(jié) 

到此這篇關(guān)于Jackson注解@JsonFormat及失效解決辦法的文章就介紹到這了,更多相關(guān)Jackson注解@JsonFormat及失效解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的線(xiàn)程池ThreadPoolExecutor細(xì)致講解

    Java中的線(xiàn)程池ThreadPoolExecutor細(xì)致講解

    這篇文章主要介紹了Java中的線(xiàn)程池ThreadPoolExecutor細(xì)致講解,線(xiàn)程池是一種基于池化思想管理線(xiàn)程的工具,經(jīng)常出現(xiàn)在多線(xiàn)程服務(wù)器中,如MySQL,線(xiàn)程過(guò)多會(huì)帶來(lái)額外的開(kāi)銷(xiāo),其中包括創(chuàng)建銷(xiāo)毀線(xiàn)程的開(kāi)銷(xiāo)、調(diào)度線(xiàn)程的開(kāi)銷(xiāo)等等,需要的朋友可以參考下
    2023-11-11
  • Mybatis之解決collection一對(duì)多問(wèn)題(顯示的結(jié)果沒(méi)有整合到一起)

    Mybatis之解決collection一對(duì)多問(wèn)題(顯示的結(jié)果沒(méi)有整合到一起)

    這篇文章主要介紹了Mybatis之解決collection一對(duì)多問(wèn)題(顯示的結(jié)果沒(méi)有整合到一起),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 利用solr實(shí)現(xiàn)商品的搜索功能(實(shí)例講解)

    利用solr實(shí)現(xiàn)商品的搜索功能(實(shí)例講解)

    下面小編就為大家分享一篇利用solr實(shí)現(xiàn)商品的搜索功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • drools規(guī)則動(dòng)態(tài)化實(shí)踐解析

    drools規(guī)則動(dòng)態(tài)化實(shí)踐解析

    這篇文章主要為大家介紹了drools規(guī)則動(dòng)態(tài)化實(shí)踐解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java創(chuàng)建和填充PDF表單域方法

    Java創(chuàng)建和填充PDF表單域方法

    在本篇文章中小編給大家分享了關(guān)于Java創(chuàng)建和填充PDF表單域方法和步驟,有需要的朋友們學(xué)習(xí)下。
    2019-01-01
  • mybatisplus的邏輯刪除問(wèn)題

    mybatisplus的邏輯刪除問(wèn)題

    這篇文章主要介紹了mybatisplus的邏輯刪除問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • spring boot上傳文件出錯(cuò)問(wèn)題如何解決

    spring boot上傳文件出錯(cuò)問(wèn)題如何解決

    這篇文章主要介紹了spring boot上傳文件出錯(cuò)問(wèn)題如何解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java 本地方法Native Method詳細(xì)介紹

    Java 本地方法Native Method詳細(xì)介紹

    這篇文章主要介紹了 Java 本地方法Native Method詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • springboot中@RequestParam和@PathVariable區(qū)別

    springboot中@RequestParam和@PathVariable區(qū)別

    本文主要介紹了springboot中@RequestParam和@PathVariable區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • 從匯編碼分析java對(duì)象的創(chuàng)建過(guò)程(推薦)

    從匯編碼分析java對(duì)象的創(chuàng)建過(guò)程(推薦)

    這篇文章主要介紹了從匯編碼分析java對(duì)象的創(chuàng)建過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

桃江县| 莱芜市| 囊谦县| 唐河县| 普宁市| 大丰市| 五大连池市| 抚顺县| 珲春市| 奈曼旗| 同德县| 蓝山县| 上高县| 文水县| 雷波县| 阜阳市| 特克斯县| 老河口市| 张家港市| 阿勒泰市| 北流市| 西丰县| 金昌市| 南昌市| 南郑县| 莱西市| 芒康县| 深圳市| 阿图什市| 隆子县| 和林格尔县| 新余市| 金塔县| 建平县| 北碚区| 怀集县| 民勤县| 洪洞县| 张家界市| 宁都县| 枣阳市|