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

当使用Spring Cloud Feign传递日期类型参数时可能会遇到以下错误:

java.lang.IllegalArgumentException: Could not read document: Invalid format: "2019-08-30T09:30:00.000Z" is malformed at "T09:30:00.000Z" 

这是因为Feign的默认编码器在将日期转换为JSON字符串时,使用了错误的格式。但是,我们可以通过自定义编码器来解决这个问题。

以下是解决这个问题的完整攻略:

  1. 添加依赖

为了解决这个问题,我们需要添加几个依赖:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 自定义配置日期格式

创建一个用于解析日期格式的配置类:

import java.time.format.DateTimeFormatter;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;

@Configuration
public class DateConfiguration {

    @Bean
    public ObjectMapper objectMapper() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(new LocalDateTimeSerializer(formatter));

        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(new LocalDateTimeSerializer(formatter));
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        objectMapper.registerModule(javaTimeModule);
        objectMapper.registerModule(simpleModule);
        return objectMapper;
    }
}
  1. 配置Feign编码器

创建一个自定义的Feign编码器来序列化和反序列化日期类型数据:

import java.lang.reflect.Type;
import java.time.LocalDateTime;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.google.common.collect.Lists;

import feign.codec.EncodeException;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;

public class FeignDateEncoder {

    @Bean
    public Encoder feignEncoder() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());

        ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(new SpringEncoder(Lists.newArrayList(new SpringFormEncoder(new SpringEncoder(objectFactory)))));

        return new Encoder() {
            private final SpringEncoder delegate = new SpringEncoder(objectFactory);

            @Override
            public void encode(Object object, Type bodyType, feign.RequestTemplate template) throws EncodeException {
                if (object instanceof LocalDateTime) {
                    String text = objectMapper.writeValueAsString(object);
                    template.body(text);
                } else {
                    delegate.encode(object, bodyType, template);
                }
            }
        };
    }
}
  1. 注册自定义Feign编码器

在启动类上注册自定义的Feign编码器:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients(defaultConfiguration = { FeignDateEncoder.class })
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

现在,就可以在Feign客户端中传递日期类型参数了,如下例:

@RequestMapping(value = "/api/user", method = RequestMethod.GET)
public void getUserByCreateTimeBetween(@RequestParam(name = "start") LocalDateTime start, @RequestParam(name = "end") LocalDateTime end);
FeignClient.getUserByCreateTimeBetween(LocalDateTime.of(2019, 8, 31, 0, 0), LocalDateTime.of(2019, 9, 1, 0, 0))

以上就是使用Spring Cloud Feign在传递日期类型参数时报错的解决方案,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springcloud feign传日期类型参数报错的解决方案 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • oracle 10g OEM常规错误(Unknown host specified)解决

    针对“Oracle10gOEM常规错误(Unknownhostspecified)解决”这个问题,我们建议您按照以下步骤进行解决。 1. 确认主机名和IP地址 该错误通常是由于主机名与IP地址不匹配或DNS查找失败导致的。因此,首先需要确认主机名和IP地址是否正确。您可以运行以下命令来查看当前主机名和IP地址: hostname ifconfig 如果主机名…

    http 2023年5月13日
    00
  • apache部署python程序出现503错误的解决方法

    当使用Apache部署Python程序时,有时会遇到503错误。这种错误通常是由于Apache无法连接到Python程序或Python程序崩溃导致的。以下是解决此问题的完整攻略: 检查Apache日志:首,我们需要检查Apache日志以查看错误的详细信息。Apache日志通常位于/var/log/apache2/目录下。我们使用以下命令查看Apache错误日…

    http 2023年5月13日
    00
  • HTTP的工作原理是什么?

    下面我来详细讲解HTTP的工作原理。 HTTP的工作原理 HTTP(Hypertext Transfer Protocol)即超文本传输协议,是一种基于客户端/服务器模式的应用层协议。它通过传输数据来通信,一般默认是80端口,每一个HTTP连接都是单独的,所以对于每一个请求都要进行一次完整的HTTP协议栈的建立。HTTP协议是TCP/IP协议族中的一个子集,…

    云计算 2023年4月27日
    00
  • npm ERR! code 128的错误问题解决方法

    问题描述: 当我们使用npm install命令安装包时,有时会遇到“npm ERR! code 128”的错误,这种错误通常表示npm无法找到或访问所需的资源。 解决方法: 清除npm cache 可以尝试清除npm的缓存,然后再次运行npm install命令,这通常可以解决问题。在终端中输入以下命令: npm cache clean –force 请…

    http 2023年5月13日
    00
  • 如何解决HTTP客户端异常问题?

    HTTP客户端异常问题分为两类:一种是与服务器端连接出现问题,另一种是客户端代码实现问题。以下是针对这两种问题的解决攻略。 服务器端连接问题解决攻略 1. 检查网络连接状态 首先需要检查客户端设备的网络连接状态,确认网络是否正常连接。如果网络连接异常,需要先解决网络问题。 2. 确认服务器地址和端口 在客户端代码中,需要确认服务器的地址和端口是否正确,尤其注…

    云计算 2023年4月27日
    00
  • 微信公众平台开发教程②微信端分享功能图文详解

    微信公众平台开发教程②微信端分享功能图文详解 微信公众平台开发中,分享功能是非常重要的部分。在本教程中,我们将细讲解微信端分享功能的实现方法,包括分享到朋友圈、分享给好友、到QQ等。以下是微信公众台开发教程②微信端分享功能图文详解的完整攻略: 步骤1:引入JS文件 首先,我们需要在文件中引入微信JS文件。我们可以使用以下代码: <script srch…

    http 2023年5月13日
    00
  • Tomcat报错: JDBC unregister 解决办法

    以下是关于“Tomcat报错:JDBCunregister解决办法”的完整攻略: 简介 Tomcat是一款流行的Java Web服务器软件,可以用于部署Java Web用程序。在使用Tomcat时,有时会遇JDBCunregister报错的问题。本文将介绍如何解决Tomcat报错:JDBCunregister的问题。 问题描述 在使用Tomcat时,时会遇到…

    http 2023年5月13日
    00
  • HTTP的安全问题有哪些?

    HTTP安全问题是指在HTTP通信过程中可能会出现的安全隐患。主要包括以下几个方面: 1.传输数据的安全问题 HTTP通信是基于明文传输的,只需要通过网络监测工具,就可以轻松截获HTTP通信的数据包,盗取其中的敏感信息。因此,需要在HTTP传输过程中采用加密措施,确保数据传输的安全性。这时,HTTPS就应运而生。HTTPS使用SSL/TLS加密协议,实现了网…

    Http网络协议 2023年4月20日
    00
合作推广
合作推广
分享本页
返回顶部