springcloud feign服务之间调用,date类型转换错误的问题

目录
  • feign服务之间调用,date类型转换错误
    • 自定义feign请求头
    • 通过判断是否为feign请求
  • OpenFeign服务间调用时日期格式异常
    • 异常为
    • 原因
    • 解决方法

feign服务之间调用,date类型转换错误

最近尝试换springcloud开发,原先是springboot,每次的返回值的Date类型都通过@ControllerAdvice格式化yyyy-MM-dd HH:mm:ss然后返回的。这次用feign之后,2个服务之间调用,一直报错查了好久百度都搞不定,后面灵光一闪。。。不多说,上方案

自定义feign请求头

标识只有feign请求会多一个flag头

@Configuration
public class FeignHeaderConfig implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String token = request.getHeader(C.API_HEADER_PARAM_TOKEN);
        String session = request.getHeader(C.API_HEADER_PARAM_SESSION);
        String timestamp = request.getHeader(C.API_HEADER_PARAM_TIMESTAMP);
        requestTemplate.header(C.API_HEADER_PARAM_TOKEN, token);
        requestTemplate.header(C.API_HEADER_PARAM_SESSION,session);
        requestTemplate.header(C.API_HEADER_PARAM_TIMESTAMP,timestamp);
        requestTemplate.header("flag","feign");//标识feign请求
    }
}

通过判断是否为feign请求

再决定是否需要格式化时间

@ControllerAdvice
@Slf4j
public class RespondeBodyConfig implements ResponseBodyAdvice {
    @Override
    public Object beforeBodyWrite(Object resBody, MethodParameter arg1, MediaType arg2, Class arg3, ServerHttpRequest req,
                                  ServerHttpResponse res) {
       //解决feign之间调用格式化,导致date类型转换错误
        List<String> flag = req.getHeaders().get("flag");
        if(flag != null && flag.size() > 0 && flag.get(0).equals("feign")){
            return resBody;
        }
        //resBody就是controller方法中返回的值,对其进行修改后再return就可以了
        ObjectMapper mapper = new ObjectMapper();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        mapper.setDateFormat(format);
        try {
            if(resBody instanceof TResult) {
                String json = mapper.writeValueAsString(resBody);
                return JSONObject.parseObject(json, TResult.class);
            }
        } catch (Exception e) {
            log.error("【全局返回值处理失败】",e);
        }
        return resBody;
    }
    @Override
    public boolean supports(MethodParameter arg0, Class arg1) {
        //这里直接返回true,表示对任何handler的responsebody都调用beforeBodyWrite方法
        return true;
    }
}

OpenFeign服务间调用时日期格式异常

异常为

com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "2021-07-27 10:35:16": not a valid representation (error: Failed to parse Date value '2021-07-27 10:35:16': Cannot parse date "2021-07-27 10:35:16": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null))

原因

使用OpenFeign进行服务间调用时返回的对象中时间类型为字符串型,接收的对象对应的类型为Date类型,openFeign转换日期格式时异常

解决方法

1.配置文件中加

spring.jackson.timeZone=GMT+08:00
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.serialization.write_dates_as_timestamps=false
spring:
  jackson:
    timeZone: GMT+08:00
    date-format: yyyy-MM-dd HH:mm:ss
    serialization.write_dates_as_timestamps: false

2、字段上加一下注解

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;

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

(0)

相关推荐

  • Spring Cloud-Feign服务调用的问题及处理方法

    概述: • Feign 是一个声明式的 REST 客户端,它用了基于接口的注解方式,很方便实现客户端配置. • Feign 最初由 Netflix 公司提供,但不支持SpringMVC注解,后由 SpringCloud 对其封装,支持了SpringMVC注 解,让使用者更易于接受 首先在调用者的pom中加入如下坐标 <!--feign--> <dependency> <groupId>org.springframework.cloud</groupId> &

  • SpringCloud Feign 传输Date类型参数存在误差的问题

    目录 Feign传输Date类型参数存在误差 时间转换代码如下 Feign传输date类型参数,时间差14个小时 JavaDate类型的时差问题 解决方法 Feign客户端的问题 解决方法 Feign传输Date类型参数存在误差 最近在项目开发过程中,前端传递过来的时间(Date类型)在A模块是正确的,然后A模块调用B模块将时间(Date类型)作为参数传过去,然后B模块接收到的时间有误差,天数会多一天,小时少10小时,这应该是SpringCloud Feign组件造成的问题 我这里的解决办法是在

  • Springcloud feign传日期类型参数报错的解决方案

    目录 feign传日期类型参数报错 Date类型参数报错 LocalDate类型报错 feign传参问题及传输Date类型参数时差的坑 下面说说两种解决方案 feign传参时候使用@DateTimeFormat注解的坑 feign传日期类型参数报错 Date类型参数报错 在Spring cloud feign接口中传递Date类型参数时报错,报错信息. 场景: 客户端传递一个new Date()的参数,服务端接受的参数和客户端有时间差. 客户端打印格式化的new Date(): 2018-05-

  • springcloud feign服务之间调用,date类型转换错误的问题

    目录 feign服务之间调用,date类型转换错误 自定义feign请求头 通过判断是否为feign请求 OpenFeign服务间调用时日期格式异常 异常为 原因 解决方法 feign服务之间调用,date类型转换错误 最近尝试换springcloud开发,原先是springboot,每次的返回值的Date类型都通过@ControllerAdvice格式化yyyy-MM-dd HH:mm:ss然后返回的.这次用feign之后,2个服务之间调用,一直报错查了好久百度都搞不定,后面灵光一闪...不多

  • Feign如何解决服务之间调用传递token

    目录 解决服务之间调用传递token Feign有提供一个接口RequestInterceptor 调用方式 Feign调用服务各种坑处理 编写被调用服务 编写调用api 编写客户端服务 解决服务之间调用传递token 现在的微服务基本就是SpringSecurity+Oauth2做的授权和认证,假如多个服务直接要通过Fegin来调用,会报错401 a.有做权限处理的服务接口直接调用会造成调用时出现http 401未授权的错误,继而导致最终服务的http 500内部服务器错误 b.解决方式:最方

  • 教你Spring Cloud保证各个微服务之间调用安全性

    导读:在微服务的架构下,系统会根据业务拆分为多个服务,各自负责单一的职责,在这样的架构下,我们需要确保各api的安全性,也就是说服务不是开放的,而是需要授权才可访问的,避免接口被不合法的请求所访问. 但是在在微服务集群中服务之间暴力的接口,或者对于第三方开放的接口如果不做及安全和认证,后果可想而知. 阅读下文之前思考几个问题: 如何在restTemplate远程调用请求增加添加统一认证? 服务认证如何规范加密和解密? 远程调用统一什么协议比较合适? 如下图,三个服务注册到同一个注册中心集群,服务

  • Spring Cloud多个微服务之间调用代码实例

    这篇文章主要介绍了Spring Cloud多个微服务之间调用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现在又一个学生微服务 user 和 学校微服务 school,如果user需要访问school,我们应该怎么做? 1.使用RestTemplate方式 添加config import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.spr

  • SpringCloud Feign 服务调用的实现

    前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列--Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调用. Feign是一个声明性web服务客户端.它使编写web服务客户机变得更容易,本质上就是一个http,内部进行了封装而已. GitHub地址:https://github.com/OpenFeign/feign 官方文档:https://cloud.spring.io/spring-cloud-

  • openFeign服务之间调用保持请求头信息处理方式

    openFeign服务间调用保持请求头信息处理 1.注意特殊情况,在定时任务或者内部之间调用,没有request的时候,不要处理直接返回. 2.在GET请求,参数确放在Body里面传递的情况,restTemplate是不认识的,所以这里要转化下处理,然后清空body数据 3.在请求过程中如果出现java.io.IOException: too many bytes written异常,请参考保持请求头造成请求头和content-length不一致 /** * 解决服务调用丢失请求头的问题 * @

  • SpringCloud Feign服务调用请求方式总结

    前言 最近做微服务架构的项目,在用feign来进行服务间的调用.在互调的过程中,难免出现问题,根据错误总结了一下,主要是请求方式的错误和接参数的错误造成的.在此进行一下总结记录.以下通过分为三种情况说明,无参数,单参数,多参数.每种情况再分get和post两种请求方式进行说明.这样的话,6种情况涵盖了feign调用的所有情况. 有个建议就是为了保证不必要的麻烦,在写feign接口的时候,与我们的映射方法保持绝对一致,同时请求方式,请求参数注解也都不偷懒的写上.如果遵循这种规范,可以避开90%的调

  • SpringCloud feign服务熔断下的异常处理操作

    今天做项目的时候,遇到一个问题,如果我调用某个服务的接口,但是这个服务挂了,同时业务要求这个接口的结果是必须的,那我该怎么办呢,答案是通过hystrix,但是又有一点,服务不是平白无故挂的(排除服务器停电等问题),也就是说有可能是timeout or wrong argument 等等,那么我该如何越过hystrix的同时又能将异常成功抛出呢 第一点:先总结一下异常处理的方式: 1):通过在controller中编写@ExceptionHandler 方法 直接在controller中编写异常处

  • SpringCloud feign微服务调用之间的异常处理方式

    如何优雅地处理微服务间调用的异常 现在微服务架构盛行,其中spring cloud方案就很具有代表. 那么在微服务之间进行调用,如果被调用的服务挂了,调用方如何感知呢? 一.加上hystrix熔断 在定义feignClient的地方指定熔断,如下图 当被调用服务不可用或者被调用方发生错误的时候,会触发熔断,但是,如果被调用方抛出异常,调用方怎么知道究竟是出了什么问题呢? 那,这就出现了 二.feign全局异常处理 我们不得不提到feign提供的一个接口叫做ErrorDecoder, 是用来处理f

  • SpringCloud hystrix服务降级学习笔记

    目录 一.Hystrix简介 1.Hystrix是什么 2.Hystrix能干什么 二.服务熔断 1.服务熔断简介 2.配置pom.xml 3.配置application.yaml 4.修改Controller 5.修改启动类 6.效果图 三.服务降级 1.什么是服务降级 2.DeptClientFailBackFactory类 3.添加注解 4.修改application.yaml 5.效果图 四.DashBorder 1.新建一个module 2.pom.xml配置 3.配置applicat

随机推荐