这篇“springboot2中使用@JsonFormat注解不生效怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot2中使用@JsonFormat注解不生效怎么解决”文章吧。

使用@JsonFormat注解不生效

百度了不少解决方式,有让用@JsonField,也有让把fastjson去掉的,也有加很多配置的,但是都没用。

本次使用的版本号

1、springboot2.2.2 ;

2、fastjson 1.1.26

3、<jackson-mapper-asl.version>1.9.10</jackson-mapper-asl.version>
<jackson-core.version>2.10.3</jackson-core.version>

第三点以及相关的依赖可能不需要,加上也没关系

pom文件中的依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>${jackson-mapper-asl.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson-core.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson-core.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson-core.version}</version></dependency>解决方式

第一步新建一个转换类 用于自定义Jackson反序列化日期类型时应用的类型转换器,一般用于@RequestBody接受参数时使用

importcom.fasterxml.jackson.core.JsonParser;importcom.fasterxml.jackson.core.JsonProcessingException;importcom.fasterxml.jackson.databind.DeserializationContext;importcom.fasterxml.jackson.databind.JsonDeserializer;importorg.apache.commons.lang3.StringUtils;importorg.apache.commons.lang3.time.DateUtils;importjava.io.IOException;importjava.text.ParseException;importjava.util.Date;/***自定义Jackson反序列化日期类型时应用的类型转换器,一般用于@RequestBody接受参数时使用*次类是借用网上别的人的,增加了一个日期格式化的类型*/publicclassDateJacksonConverterextendsJsonDeserializer<Date>{//此处尤为重要,请查找自己控制台报错的日期格式化类型是啥样的//我的是2020-04-29T16:23:44.999Z所以我在下面的数组中添加了"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"格式;如果下面数组中没有你要的格式化类型,其他的可自行根据自己的情况去添加即可privatestaticString[]pattern=newString[]{"yyyy-MM-dd","yyyy-MM-ddHH:mm","yyyy-MM-ddHH:mm:ss","yyyy-MM-ddHH:mm:ss.S","yyyy.MM.dd","yyyy.MM.ddHH:mm","yyyy.MM.ddHH:mm:ss","yyyy.MM.ddHH:mm:ss.S","yyyy/MM/dd","yyyy/MM/ddHH:mm","yyyy/MM/ddHH:mm:ss","yyyy/MM/ddHH:mm:ss.S","yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"};@OverridepublicDatedeserialize(JsonParserp,DeserializationContextctxt)throwsIOException,JsonProcessingException{DatetargetDate=null;StringoriginDate=p.getText();if(StringUtils.isNotEmpty(originDate)){try{longlongDate=Long.valueOf(originDate.trim());targetDate=newDate(longDate);}catch(NumberFormatExceptione){try{targetDate=DateUtils.parseDate(originDate,DateJacksonConverter.pattern);}catch(ParseExceptionpe){thrownewIOException(String.format("'%s'cannotconverttotype'java.util.Date',justsupporttimestamp(typeoflong)andfollowingdateformat(%s)",originDate,StringUtils.join(pattern,",")));}}}returntargetDate;}@OverridepublicClass<?>handledType(){returnDate.class;}}

创建好上边的类之后,如果不想继续,则可以在实体对象属性上加注解就完全可以了。

导入的包路径为:

importcom.fasterxml.jackson.databind.annotation.JsonDeserialize;

@JsonDeserialize(using=DateJacksonConverter.class)privateDatestartDate;

如果不想去让实体类加这个注解,可以在写一个公共配置,如下:

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean;importorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fx.base.serializer.DateJacksonConverter;@ConfigurationpublicclassConverterConfig{@BeanpublicDateJacksonConverterdateJacksonConverter(){returnnewDateJacksonConverter();}@BeanpublicJackson2ObjectMapperFactoryBeanjackson2ObjectMapperFactoryBean(@AutowiredDateJacksonConverterdateJacksonConverter){Jackson2ObjectMapperFactoryBeanjackson2ObjectMapperFactoryBean=newJackson2ObjectMapperFactoryBean();jackson2ObjectMapperFactoryBean.setDeserializers(dateJacksonConverter);returnjackson2ObjectMapperFactoryBean;}@BeanpublicMappingJackson2HttpMessageConvertermappingJackson2HttpMessageConverter(@AutowiredObjectMapperobjectMapper){MappingJackson2HttpMessageConvertermappingJackson2HttpMessageConverter=newMappingJackson2HttpMessageConverter();mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);returnmappingJackson2HttpMessageConverter;}}

此时就不必再每个实体类属性上加注解了。

@JsonFormat和@DateTimeFormat的作用

@DatetimeFormat是将String转换成Date,一般前台给后台传值时用

importorg.springframework.format.annotation.DateTimeFormat;/***前台传后台时,字符串自动封装成日期*/@DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")privateDatebirth;

@JsonFormat(pattern=”yyyy-MM-dd”) 将Date转换成String 一般后台传值给前台时

importcom.fasterxml.jackson.annotation.JsonFormat;/***后台返给前台时,日期自动格式化*/@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss")privateDatebirth;

注意:

@JsonFormat不仅可以完成后台到前台参数传递的类型转换,还可以实现前台到后台类型转换。

当content-type为application/json时,优先使用@JsonFormat的pattern进行类型转换。而不会使用@DateTimeFormat进行类型转换。

@JsonFormat注解的作用就是完成json字符串到java对象的转换工作,与参数传递的方向无关。

以上就是关于“springboot2中使用@JsonFormat注解不生效怎么解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。