广告
返回顶部
首页 > 资讯 > 精选 >Feign日期格式转换错误怎么解决
  • 253
分享到

Feign日期格式转换错误怎么解决

2023-06-29 13:06:58 253人浏览 安东尼
摘要

本篇内容主要讲解“Feign日期格式转换错误怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Feign日期格式转换错误怎么解决”吧!出现的场景服务端通过springMVC写了一个对外的接口

本篇内容主要讲解“Feign日期格式转换错误怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Feign日期格式转换错误怎么解决”吧!

出现的场景

  • 服务端通过springMVC写了一个对外的接口,返回一个JSON字符串,其中该json带有日期,格式为yyyy-MM-dd HH:mm:ss

  • 客户端通过feign调用该Http接口,指定返回值为一个Dto,Dto中日期的字段为Date类型

  • 客户端调用该接口后抛异常了。

报错异常如下

feign.codec.DecodeException: JSON parse error: Can not deserialize value of type java.util.Date from String "2018-03-07 16:18:35": not a valid representation (error: Failed to parse Date value '2018-03-07 16:18:35': Can not parse date "2018-03-07 16:18:35Z": while it seems to fit fORMat 'yyyy-MM-dd'T'HH:mm:ss.SSS'Z'', parsing fails (leniency? null)); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.util.Date from String "2018-03-07 16:18:35": not a valid representation (error: Failed to parse Date value '2018-03-07 16:18:35': Can not parse date "2018-03-07 16:18:35Z": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS'Z'', parsing fails (leniency? null)) at [Source: java.io.PushbackInputStream@4615bc00; line: 1, column: 696] (through reference chain: com.RestfulDataBean["data"]->java.util.ArrayList[0]->com.entity.XxxDto["createTime"])    at feign.SynchronousMethodHandler.decode(SynchronousMethodHandler.java:169)    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:133)    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76)    at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103)    at         com.sun.proxy.$Proxy138.queryMonitorByTime(Unknown Source)

从异常信息中我们可以看出,是在AbstractJackson2HttpMessageConverter类中调用了readJavaType方法之后抛的异常

一步一步往下深入,我们找到了最关键的地方,在DeserializationContext类的_parseDate方法中,执行了df.parse(dateStr)之后抛异常了

public Date parseDate(String dateStr) throws IllegalArgumentException{      try {        DateFormat df = getDateFormat();        // 这行代码报错了        return df.parse(dateStr);    } catch (ParseException e) {               throw new IllegalArgumentException(String.format(                                   "Failed to parse Date value '%s': %s", dateStr, e.getMessage()));    }}

DeserializationContext是jackson的一个反序列化的一个上下文,那么它的DateFormat是从哪来的呢?我们再来看下getDateFormat的源码

protected DateFormat getDateFormat(){       if (_dateFormat != null) {                return _dateFormat;    }    DateFormat df = _config.getDateFormat();    _dateFormat = df = (DateFormat) df.clone();        return df;}

DateFormat又是从MapperConfig而来,我们再看下config.getDateFormat()的源码

public final DateFormat getDateFormat() {     return _base.getDateFormat(); }

我们知道,springmvc就是通过AbstractJackson2HttpMessageConverter类来整合jackson的,该类维护jackson的ObjectMapper,而ObjectMapper又是通过MapperConfig来进行配置的

由此可见,本异常就是因为ObjectMapper中的DateFormat无法对yyyy-MM-dd HH:mm:ss格式的字符串进行转换所导致的

问题处理

第一种处理方式

Feign日期格式转换错误怎么解决

时间属性添加注解,进行自动转换。

第二种方式

异常说的值服务器返回了一个带有日期的json,日期的形式是字符串2018-03-07 16:18:35,jackson无法将该字符串转成一个Date对象,网上查资料,上面说的是jackson只支持以下几种日期格式:

  • "yyyy-MM-dd'T'HH:mm:ss.SSSZ";

  • "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

  • "yyyy-MM-dd";

  • "EEE, dd MMM yyyy HH:mm:ss zzz";

  • long类型的时间戳

去掉服务端的以下两个配置,让日期返回时间戳,结果就没报错了

#spring.jackson.date-format=yyyy-MM-dd HH:mm:ss#spring.jackson.time-zone=Asia/Chongqing

由于服务端在其他的地方有可能和这里的配置耦合了,也就是说其他地方有可能要用到的是yyyy-MM-dd HH:mm:ss这一日期格式而不是时间戳的格式,所以这个配置肯定是不能修改的。

jackson竟然不支持yyyy-MM-dd HH:mm:ss的这种格式,肯定很不爽啦,所以下面就要开始来研究怎么让jackson支持这种格式了。

要让jackson支持这种格式,那么就必须修改ObjectMapper中的DateFormat,因为在ObjectMapper中,DateFormat的默认实现类是StdDateFormat,StdDateFormat也就只兼容了我们上述所说的几种格式

首先我们先使用装饰模式来创建一个支持yyyy-MM-dd HH:mm:ss格式的DateFormat如下

import java.text.DateFormat;import java.text.FieldPosition;import java.text.ParseException;import java.text.ParsePosition;import java.text.SimpleDateFormat;import java.util.Date; public class MyDateFormat extends DateFormat {    private DateFormat dateFormat;    private SimpleDateFormat format1 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");    public MyDateFormat(DateFormat dateFormat) {        this.dateFormat = dateFormat;}    @Overridepublic StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {        return dateFormat.format(date, toAppendTo, fieldPosition);}    @Overridepublic Date parse(String source, ParsePosition pos) { Date date = null;        try { date = format1.parse(source, pos);} catch (Exception e) { date = dateFormat.parse(source, pos);}return date;}// 主要还是装饰这个方法    @Overridepublic Date parse(String source) throws ParseException { Date date = null;        try {// 先按我的规则来date = format1.parse(source);} catch (Exception e) {// 不行,那就按原先的规则吧date = dateFormat.parse(source);}return date;}// 这里装饰clone方法的原因是因为clone方法在jackson中也有用到    @Overridepublic Object clone() {Object format = dateFormat.clone();        return new MyDateFormat((DateFormat) format);}}

DateFormat有了,接下来的任务就是让ObjectMapper使用我的这个DateFormat了,在config类中定义如下(本案例基于SpringBoot

@Configurationpublic class WEBConfig {    @Autowiredprivate Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder;@Beanpublic MappingJackson2HttpMessageConverter MappingJsonpHttpMessageConverter() { ObjectMapper mapper = jackson2ObjectMapperBuilder.build();// ObjectMapper为了保障线程安全性,里面的配置类都是一个不可变的对象// 所以这里的setDateFormat的内部原理其实是创建了一个新的配置类DateFormat dateFormat = mapper.getDateFormat();mapper.setDateFormat(new MyDateFormat(dateFormat)); MappingJackson2HttpMessageConverter mappingJsonpHttpMessageConverter = new MappingJackson2HttpMessageConverter(mapper);return mappingJsonpHttpMessageConverter;}}

配置了上述代码之后,问题成功解决。

为什么往spring容器中注入MappingJackson2HttpMessageConverter,springMvc就会用这个Converter呢?

查看springboot的源代码如下:

@Configurationclass JacksonHttpMessageConvertersConfiguration {@Configuration@ConditionalOnClass(ObjectMapper.class)@ConditionalOnBean(ObjectMapper.class)@ConditionalOnProperty(name = HttpMessageConvertersAutoConfiguration.PREFERRED_MAPPER_PROPERTY, havingValue = "jackson", matchIfMissing = true)protected static class MappingJackson2HttpMessageConverterConfiguration {@Bean@ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class, ignoredType = {"org.springframework.hateoas.mvc.TypeConstrainedMappingJackson2HttpMessageConverter","org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter" })public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {    return new MappingJackson2HttpMessageConverter(objectMapper);} }

默认配置为,当spring容器中没有MappingJackson2HttpMessageConverter这个实例的时候才会被创建

springboot的思想是约定优于配置,也就是说,springboot默认帮我们配好了spring mvc的Converter,如果我们没有自定义Converter的话,那么框架就会帮我们创建一个,如果我们有自定义的话,那么springboot就直接使用我们所注册的bean进行绑定

到此,相信大家对“Feign日期格式转换错误怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Feign日期格式转换错误怎么解决

本文链接: https://www.lsjlt.com/news/324958.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Feign日期格式转换错误怎么解决
    本篇内容主要讲解“Feign日期格式转换错误怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Feign日期格式转换错误怎么解决”吧!出现的场景服务端通过springmvc写了一个对外的接口...
    99+
    2023-06-29
  • Feign 日期格式转换错误的问题
    目录出现的场景报错异常如下问题处理第一种处理方式第二种方式出现的场景 服务端通过springmvc写了一个对外的接口,返回一个json字符串,其中该json带有日期,格式为yyyy-...
    99+
    2022-11-13
  • 怎么解决PostgreSQL日期格式导致的错误
    这篇文章主要讲解了“怎么解决PostgreSQL日期格式导致的错误”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决PostgreSQL日期格式导致的错...
    99+
    2022-10-18
  • javascript日期格式怎么转换成年月日
    这篇文章将为大家详细讲解有关javascript日期格式怎么转换成年月日,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。js日期格式转换的方法:1、使用“new Date()”获取当前日期;2、使用getF...
    99+
    2023-06-14
  • springcloud feign服务间调用date类型转换错误怎么解决
    这篇文章主要讲解了“springcloud feign服务间调用date类型转换错误怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springcloud feig...
    99+
    2023-06-29
  • sql日期格式转换函数是什么
    这篇文章主要介绍sql日期格式转换函数是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!sql日期格式转换函数有:1、【Select CONVERT(GETDATE(), 23)】...
    99+
    2022-10-18
  • SQL 怎么将日期格式转换为常用字符串格式
    SQL 怎么将日期格式转换为常用字符串格式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SQL 将日期格式转换为常用字符串格...
    99+
    2022-10-18
  • PHP中怎么将时间戳转换为日期格式
    本篇内容主要讲解“PHP中怎么将时间戳转换为日期格式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP中怎么将时间戳转换为日期格式”吧!一、什么是时间戳时间戳是指从1970年1月1日00:00...
    99+
    2023-07-05
  • PHP怎么将Unix时间戳转换成日期格式
    这篇文章主要介绍了PHP怎么将Unix时间戳转换成日期格式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PHP怎么将Unix时间戳转换成日期格式文章都会有所收获,下面我们一起来看看吧。第一种方法是使用PHP中的...
    99+
    2023-07-05
  • access日期格式转换的方法是什么
    在Access中,可以使用Format函数来进行日期格式转换。下面是一个示例:1. 转换日期为特定格式:格式:Format(日期, ...
    99+
    2023-09-09
    access
  • 怎么用PHP将年月日转换为不同的日期格式
    这篇文章主要介绍了怎么用PHP将年月日转换为不同的日期格式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用PHP将年月日转换为不同的日期格式文章都会有所收获,下面我们一起来看看吧。日期和时间的概念在介绍如何...
    99+
    2023-07-05
  • javascript怎么将时间戳转换为普通日期格式
    小编给大家分享一下javascript怎么将时间戳转换为普通日期格式,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!javascript把时间戳转换为普通日期格式的方法:1、使用Date toLocaleString方法;2...
    99+
    2023-06-14
  • php怎么将日期时间转换为y m d格式
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php将日期时间转换为y m d格式可以转为两个步骤:使用strtotime()将指定日期时间转为时间戳使用date()函数格式化时间戳,将其转为“y m d”格式的时...
    99+
    2017-09-28
    php 日期时间 y m d格式
  • php怎么将string转为日期格式
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php将string转为日期格式实现方法:使用strtotime()从字符串中提取时间日期,将英文文本描述的日期时间描述解析为 UNIX 时间戳date()格式化时间戳...
    99+
    2014-10-05
    php php日期时间
  • php怎样将日期时间转换为y m d格式
    小编今天带大家了解php怎样将日期时间转换为y m d格式,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“php怎样将日期时间转换为y...
    99+
    2023-06-28
  • 怎么使用PHP时间戳转换源码来转换时间戳为日期格式
    这篇“怎么使用PHP时间戳转换源码来转换时间戳为日期格式”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用PHP时间戳转...
    99+
    2023-07-05
  • php 怎么将数值转为日期格式
    php将数值转为日期格式的方法:1、创建一个php示例文件;2、通过“$time = (40847 – 25569) * 24*60*60;”方法获得秒数;3、通过“echo date('Y-m-d H:i:s', $tim...
    99+
    2023-05-14
    日期 php 数值
  • 怎么使用PHP将字符串转换成日期时间格式
    这篇“怎么使用PHP将字符串转换成日期时间格式”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用PHP将字符串转换成日期...
    99+
    2023-07-05
  • Python3时间转换之时间戳转换为指定格式的日期方法详解
    在写Python的时候经常会遇到时间格式的问题,首先就是最近用到的时间戳(timestamp)和时间字符串之间的转换。所谓时间戳,就是从 1970年1月1日 00:00:00 到现在...
    99+
    2022-11-12
  • MongoDB中怎么将时间戳转为日期格式
    这篇文章给大家介绍MongoDB中怎么将时间戳转为日期格式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。MongoDB模糊查询方法示例:模糊查询:tname包含某个关键字测试'...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作