返回顶部
首页 > 资讯 > 后端开发 > Python >Feign 日期格式转换错误的问题
  • 578
分享到

Feign 日期格式转换错误的问题

2024-04-02 19:04:59 578人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录出现的场景报错异常如下问题处理第一种处理方式第二种方式出现的场景 服务端通过springMVC写了一个对外的接口,返回一个JSON字符串,其中该json带有日期,格式为yyyy-

出现的场景

  • 服务端通过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格式的字符串进行转换所导致的

问题处理

第一种处理方式

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

第二种方式

异常说的值服务器返回了一个带有日期的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;
	}
	
    @Override
	public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {		
        return dateFormat.format(date, toAppendTo, fieldPosition);
	}
	
    @Override
	public 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;
	}	// 主要还是装饰这个方法
	
    @Override
	public 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中也有用到
	
    @Override
	public Object clone() {
		Object format = dateFormat.clone();		
        return new MyDateFormat((DateFormat) format);
	}
}

DateFormat有了,接下来的任务就是让ObjectMapper使用我的这个DateFormat了

在config类中定义如下(本案例基于springboot)

@Configuration
public class WEBConfig {	
    @Autowired
	private Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder;	
	@Bean
	public 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进行绑定

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Feign 日期格式转换错误的问题

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

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

猜你喜欢
  • Feign 日期格式转换错误的问题
    目录出现的场景报错异常如下问题处理第一种处理方式第二种方式出现的场景 服务端通过springmvc写了一个对外的接口,返回一个json字符串,其中该json带有日期,格式为yyyy-...
    99+
    2024-04-02
  • Feign日期格式转换错误怎么解决
    本篇内容主要讲解“Feign日期格式转换错误怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Feign日期格式转换错误怎么解决”吧!出现的场景服务端通过springmvc写了一个对外的接口...
    99+
    2023-06-29
  • Hive日期格式如何转换
    这篇文章主要介绍了Hive日期格式如何转换的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Hive日期格式如何转换文章都会有所收获,下面我们一起来看看吧。背景日期计算平时在业务取数时经常涉及到,但是数据库中经常存...
    99+
    2023-07-02
  • PHP数值转日期格式的常见问题解决
    PHP作为一种流行的编程语言,广泛应用于各种网络开发领域。在实际工作中,我们有时会遇到需要将数值转换为日期格式的问题。本文将介绍一些在PHP中常见的数值转日期格式的问题,并提供具体的代...
    99+
    2024-04-02
  • springcloud feign服务之间调用,date类型转换错误的问题
    目录feign服务之间调用,date类型转换错误自定义feign请求头通过判断是否为feign请求openfeign服务间调用时日期格式异常异常为原因解决方法feign服务之间调用,...
    99+
    2024-04-02
  • Hive常用日期格式转换语法
    目录获取当前时间日期格式转换返回日期中的年,月,日,时,分,秒,当前的周数计算日期差值返回当月或当年的第一天参考汇总获取当前时间 获取当前时间戳 select unix_timestamp() 把时间戳转为正常...
    99+
    2022-06-30
    Hive日期格式转换 Hive格式转换
  • Hive日期格式转换方法总结
    目录背景时间戳日期格式转换背景 日期计算平时在业务取数时经常涉及到,但是数据库中经常存放着不同的日期格式,有的存放是时间戳、有的是字符串等,这时需要对其进行转换才能提取到准确的数据,这里介绍的均是hive里面的函数功能,...
    99+
    2022-06-23
    Hive日期格式转换 Hive格式转换
  • php时间戳转换为日期格式
    如何在 php 中将时间戳转换为日期格式?使用 date() 函数,传递格式字符串和时间戳。php 提供预定义的格式字符串,如 y(年份)、m(月份)、d(日期)。实战案例:将时间戳显示...
    99+
    2024-04-09
    时间戳 日期格式
  • javascript日期格式怎么转换成年月日
    这篇文章将为大家详细讲解有关javascript日期格式怎么转换成年月日,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。js日期格式转换的方法:1、使用“new Date()”获取当前日期;2、使用getF...
    99+
    2023-06-14
  • linux shell实现转换输入日期的格式
    对于用户输入日期的合法性检验,是个很重要的问题,这个例子是简单得取得用户输入的日期,并转换为相应的格式,但不完美,原因请看后文。 #!/bin/sh # normdate -- Normalizes m...
    99+
    2022-06-04
    日期 格式 linux
  • MySQL函数date_format()日期格式转换的实现
    一、在oracle中,当想把字符串为‘2011-09-20 08:30:45’的格式转化为日期格式,我们可以使用oracle提供的to_date函数。 sql语句为: SELECT to_...
    99+
    2022-08-12
    MySQLdate_format日期转换 MySQLdate_format转换
  • access日期格式转换的方法是什么
    在Access中,可以使用Format函数来进行日期格式转换。下面是一个示例:1. 转换日期为特定格式:格式:Format(日期, ...
    99+
    2023-09-09
    access
  • 如何转换layUI的数据表格中的日期格式
    这篇文章主要介绍如何转换layUI的数据表格中的日期格式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!转换layUI的数据表格中的日期格式前端jsp代码 <table...
    99+
    2024-04-02
  • MSSQL日期格式转换函数(使用CONVERT)
    使用 CONVERT:CONVERT ( data_type [ ( length ) ] , expression [ , style ] )convert(varchar(10),字段名,转换...
    99+
    2024-04-02
  • sql日期格式转换函数是什么
    这篇文章主要介绍sql日期格式转换函数是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!sql日期格式转换函数有:1、【Select CONVERT(GETDATE(), 23)】...
    99+
    2024-04-02
  • SpringBootJSON全局日期格式转换器实现方式
    目录需求分析一. 前期准备1.1 日期正则注解1.2 日期格式定数1.3 日期转换工具类二. 方式1-继承DateDeserializer类,重写_parseDate方法三. 方式2...
    99+
    2023-05-16
    SpringBoot JSON日期格式转换 SpringBoot全局日期格式
  • SpringBoot中 Jackson 日期的时区和日期格式问题解决
    目录1、使用场景1.1、数据库MySQL也是有时区的概念的。1.2、系统时区意味着与计算机的操作系统时区相同。1.2、SpringBoot默认的Json视图转换框架Jackson也有...
    99+
    2022-12-10
    SpringBoot Jackson日期的时区 SpringBoot Jackson日期格式
  • java中日期格式转换的方法有哪些
    Java中日期格式转换的方法有以下几种:1. SimpleDateFormat类:通过指定的模式将日期转换为字符串,或者将字符串解析...
    99+
    2023-08-17
    java
  • MySQL日期函数与日期转换格式化函数有哪些
    这篇文章将为大家详细讲解有关MySQL日期函数与日期转换格式化函数有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Mysql作为一款开元的免费关系型数据库,用户基础非...
    99+
    2024-04-02
  • js日期格式化yyyy-MM-dd问题
    目录js日期格式化yyyy-MM-dd方法一方法二yyyy-MM-dd和YYYY-MM-dd格式化日期的区别你知道吗?这里我们就要注意一个问题出大问题了总结js日期格式化yyyy-M...
    99+
    2023-01-28
    js日期格式化yyyy-MM-dd js日期格式化 js yyyy-MM-dd
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作