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日

相关文章

  • HTTP请求出现403错误的原因是什么?

    当我们向一个网站发送请求时,有时会遇到 “HTTP 403 Forbidden” 的错误。这意味着我们的请求被服务器拒绝了。下面我将详细讲解HTTP请求出现403错误的原因以及如何解决。 什么是HTTP 403 Forbidden错误? HTTP 403错误是HTTP状态码中的一种,表示向服务器发出的请求被服务器拒绝了。当服务器无法确认请求的身份或请求不被服…

    云计算 2023年4月27日
    00
  • Nginx实现跨域使用字体文件的配置详解

    以下是关于“Nginx实现跨域使用字体文件的配置详解”的完整攻略: 简介 在使用Nginx进行Web开发时,可能遇到跨域使用字体的问题。本文将介绍如何使用Nginx实现跨域使用字体文件的配置。 解决方案 解决Nginx跨域使用字体文件的问题,可以按照以下步骤进行: 1. 添加跨域配置 在Nginx配置文件中添加跨域配置,可以解决这个问题。可以使用以下代码添加…

    http 2023年5月13日
    00
  • python连接clickhouse的端口问题及解决

    Python连接ClickHouse数据库需要用到ClickHouse的客户端驱动程序。不过在连接过程中,可能会出现有关端口的问题。本文将详细讲解Python连接ClickHouse数据库的端口问题及解决方案。 一、ClickHouse端口简介 首先,我们需要了解一下ClickHouse数据库的端口号。ClickHouse默认使用TCP协议,端口号为8123…

    http 2023年5月13日
    00
  • vue安装遇到的5个报错及解决方法

    在安装Vue时,可能会遇到各种各样的报错。以下是解决Vue安装过程中遇到的5个常见报错及解决方法,其中包含两个示例。 解决Vue安装过程中遇到的5个常见报错 在安装Vue时,可能会遇到以下5个常见报错: 报错1:npm ERR! code EACCES 这个报错通常是由于权限问题导致的。您可以尝试使用sudo命令来提升权限,例如: sudo npm inst…

    http 2023年5月13日
    00
  • 解决Maven 项目报错 java.httpservlet和synchronized使用方法

    以下是关于“解决Maven项目报错java.httpservlet和synchronized使用方法”的完整攻略: 问题描述 在使用Maven项目时,我们可能会遇到.httpservlet和synchronized使用方法的。这种情况通常是由于缺少相关依赖或使用方法不正确导致的。下面我们将介绍如何解决Maven项目报错java.httpservlet和syn…

    http 2023年5月13日
    00
  • IDEA启动报错Internal error. Please refer to https://jb.gg/ide/critical-startup-errors解决办法

    以下是关于“IDEA启动报错Internal error. Please refer to https://jb.gg/ide/critical-startup-errors解决办法”的完整攻略: 问题描述 在启动IntelliJ IDEA时,可能会遇到“Internal error. Please refer to https://jb.gg/ide/cr…

    http 2023年5月13日
    00
  • sql2000报错Successfully re-opened the local eventlog解决方法

    标题:Sql2000报错Successfully re-opened the local eventlog解决方法 在Sql2000中,有时候会遇到“Successfully re-opened the local eventlog”的错误信息。这个错误信息通常是由于Sql Server的日志系统出现错误引起的。在这篇攻略中,我们将详细讲解如何解决这个问题。…

    http 2023年5月13日
    00
  • HTTP的Accept-Encoding头部有哪些取值?

    HTTP的Accept-Encoding头部是用来告诉Web服务器自己支持哪些压缩算法的。其中常见的取值如下: gzip gzip是一种基于DEFLATE算法的压缩格式,可以使用zlib库进行压缩和解压缩。使用gzip压缩后的数据一般可以减少60-70%的数据量,从而可以提高网络传输效率。客户端支持gzip的请求头部如下: Accept-Encoding: …

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