Spring boot中,feign远程调用api,用@SpringQueryMap接收GET请求参数,自定义QueryMapEncoder处理特殊类型的参数转换

2023-11-20

feign远程调用时,get请求时,如果有特殊的字段类型,用@SpringQueryMap接收参数时,会出现异常,需要自定义QueryMapEncoder

本文例举OffsetDateTime字段类型处理:

1.OffsetDateTimeQueryMapEncoder文件:

import feign.Param;

import feign.QueryMapEncoder;

import feign.codec.EncodeException;

import org.apache.commons.lang3.ObjectUtils;



import java.lang.reflect.Field;

import java.time.OffsetDateTime;

import java.time.format.DateTimeFormatter;

import java.util.*;

import java.util.concurrent.ConcurrentHashMap;

import java.util.stream.Collectors;



public class OffsetDateTimeQueryMapEncoder implements QueryMapEncoder {

private final Map<Class<?>, ObjectParamMetadata> classToMetadata = new ConcurrentHashMap<>();



@Override

public Map<String, Object> encode(Object object) throws EncodeException {

ObjectParamMetadata metadata = classToMetadata.computeIfAbsent(object.getClass(),

ObjectParamMetadata::parseObjectType);



return metadata.objectFields.stream()

.map(field -> this.FieldValuePair(object, field))

.filter(fieldObjectPair -> fieldObjectPair.right.isPresent())

.collect(Collectors.toMap(this::fieldName, this::fieldObject));



}



private String fieldName(Pair<Field, Optional<Object>> pair) {

Param alias = pair.left.getAnnotation(Param.class);

return alias != null ? alias.value() : pair.left.getName();

}



// 可扩展为策略模式,支持更多的格式转换

private Object fieldObject(Pair<Field, Optional<Object>> pair) {

Object fieldObject = pair.right.get();

if (ObjectUtils.isNotEmpty(fieldObject) && fieldObject instanceof OffsetDateTime) {

fieldObject = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss xxx").format((OffsetDateTime) fieldObject);

}

return fieldObject;

}



private Pair<Field, Optional<Object>> FieldValuePair(Object object, Field field) {

try {

return Pair.pair(field, Optional.ofNullable(field.get(object)));

} catch (IllegalAccessException e) {

throw new EncodeException("Failure encoding object into query map", e);

}

}



private static class ObjectParamMetadata {



private final List<Field> objectFields;



private ObjectParamMetadata(List<Field> objectFields) {

this.objectFields = Collections.unmodifiableList(objectFields);

}



private static ObjectParamMetadata parseObjectType(Class<?> type) {

List<Field> allFields = new ArrayList<Field>();



for (Class<?> currentClass = type; currentClass != null; currentClass = currentClass.getSuperclass()) {

Collections.addAll(allFields, currentClass.getDeclaredFields());

}



return new ObjectParamMetadata(allFields.stream()

.filter(field -> !field.isSynthetic())

.peek(field -> field.setAccessible(true))

.collect(Collectors.toList()));

}

}



private static class Pair<T, U> {

private Pair(T left, U right) {

this.right = right;

this.left = left;

}



public final T left;

public final U right;



public static <T, U> Pair<T, U> pair(T left, U right) {

return new Pair<>(left, right);

}



}

}

2.在FeignConfig中,配置自定义的OffsetDateTimeQueryMapEncoder:

@Configuration

public class FeignConfig {


@Bean

public QueryMapEncoder queryMapEncoder() {

return new OffsetDateTimeQueryMapEncoder();

}



}

3.在远程需要使用feign的api接口,引用configuration:

@FeignClient(contextId = "xxxx",name = "xxxx",configuration = FeignConfig.class)

配置完成后,使用OffesetDateTime作为参数,get传参就不会报错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring boot中,feign远程调用api,用@SpringQueryMap接收GET请求参数,自定义QueryMapEncoder处理特殊类型的参数转换 的相关文章

随机推荐

  • 代码段中存放数据

    1 前面我们写的程序中 只有一个代码段 我们先来在代码段中使用数据 看看和单独一个数据段存放数据有什么差别 考虑这样一个问题 编程计算以下8个数据的和 结果存放在ax寄存器中 0123H 0456H 0789H 0abcH 0defH 0f
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • python3.7在centos下安装pygame

    python编程从入门到实践 一书的第二部分开始 需要安装pygame 我用的是centos7 里面有内置的python2 我自己装了python3 7 pip安装pip3 安装过程网上教程很多 但是一般安装的不完全 需要注意的是安装ssl
  • 关于Yarn的一些个人总结

    文章目录 前言 一 Yarn是什么 二 Yarn由什么组成 三 Yarn用来做什么 四 Yarn的优势是什么 五 Yarn解决了什么问题 总结 前言 在前面我们可以得出Yarn是Hadoop生态圈中一个重要得组成部分 主管资源管理 但是具体
  • 2021赣网杯网络安全大赛_部分Writeup

    目录 Web 1 checkin 2 gwb web easypop 3 gwb web2 挖洞大师 misc 1 decodemaster 2 gwb misc lovemath 3 gwb misc3 testcat Web 1 che
  • C++11智能指针之std::shared_ptr

    std shared ptr是在c 11中引入的一种智能指针 其特点是它所指向的资源具有共享性 即多个shared ptr可以指向同一份资源 在c 中使用shared ptr需要包含
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • 有些变压器的中性点为何要装避雷器?

    有些变压器的中性点为何要装避雷器 答 当变压器的中性点接地运行时 是不需要装避雷器的 但是 由于运行方式的需要 为了防止单相接地事故时短路电流过大 220kV及以下系统中有部分变压器的中性点是断开运行的 在这种情况下 对于中性点绝缘不是按照
  • 6.js--布尔值和null

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 目录 1 布尔数据 boolean 2 null 3 null和undefined的意义 1 布尔数据 boolean var a true var b false
  • CSDN创作说明

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • 计算机丢失MSVCR120.dll是什么意思,电脑找不到MSVCR120.dll如何修复?

    我们在玩游戏或者运行一些软件的时候 系统提示无法启动此程序 因为计算机中丢失MSVCR120 dll 尝试重新安装该程序以解决此问题 这个需要怎么修复呢 详细困扰着不少小伙伴 小编今天就把教程分享给大家 方法如下 首先是打开电脑浏览器后在顶
  • Java判断时间是否超过30天,java 字符串时间 判断是否在30天内

    时间是字符串类型时 比较大小的时候 先要 转化成 时间格式 然后在进行比较 字符串比较大小的规则 首先取出两个字符串的长度 比较较小的长度内 两者是否相等 若不相等 则直接返回该位置字符的ASCII码相减后的值 若各位置都相等 则将两个字符
  • 问题 A: 天天向上

    题目描述 假设某同学初始能力值为1 现在该同学学习10天 休息1天 学习一天 能力提升0 001 休息一天 能力下降0 001 问一年 365天 后该同学的能力是多少 输出 365天后该同学的能力是 保留小数点6位 分析 书上76页有类似的
  • STM32 串行FLASH文件系统FatFs

    目录 一 Windows系统为例 二 文件系统的结构与特性 为什么要应用文件分配表 三 FatFs文件系统 1 FatFs 文件系统源码介绍 2 FatFs在程序中的关系网 四 配置FatFs移植程序 1 配置diskio c文件 2 配置
  • MobaXterm x11-forwarding

    Linux系统也是有图像界面的 它的方式和Windows不一样 叫做 X Window 采用的是X11协议 X11 中的 X 指的就是 X 协议 11 指的是采用 X 协议的第 11 个版本 客户端是X server 用MobaXterm登
  • CocosCretor解决premultipliedAlpha黑边问题

    在官方文档中的说明 premultipliedAlpha 对于是否启动贴图预乘 当图片的透明区域出现色块时 需要关闭该选项 当图片的半透明区域颜色变黑时 需要启用该选项 之前在项目中导出的spine有黑边问题 也就是半透明区域颜色变黑 然后
  • 《软件测试的艺术》第五章 模块(单元)测试

    软件测试的艺术 第五章 模块 单元 测试 5 0 前言 5 1 测试用例设计 5 2 增量测试 5 3 自顶向下测试和自底向上测试 5 3 1 自顶向下的测试 5 3 2 自底向上的测试 5 3 3 比较 5 4 执行测试 5 5 小结 参
  • vite-svg-loader,在项目里轻松使用svg,ts项目需特别注意!

    前言 vite svg loader插件可以让我们像使用vue组件那样使用svg图 使用起来超级方便 安装 npm install vite svg loader save dev 使用 1 vite config ts配置 import
  • 解决Flutter键盘弹起导致与输入框有间距问题(Flutter键盘弹起Scaffold布局流程)解析

    一 在项目中遇到了个如下问题 当页面底部有个输入框 点击弹出键盘时 输入框与键盘之间有一段间距 通过排除 最后找到了问题根源所在 原因是使用了这个屏幕适配框架导致的 此框架通过直接修改FlutterViewConfiguration 的si
  • Spring boot中,feign远程调用api,用@SpringQueryMap接收GET请求参数,自定义QueryMapEncoder处理特殊类型的参数转换

    feign远程调用时 get请求时 如果有特殊的字段类型 用 SpringQueryMap接收参数时 会出现异常 需要自定义QueryMapEncoder 本文例举OffsetDateTime字段类型处理 1 OffsetDateTimeQ