feign接口使用JSONObject作为参数遇到的问题

open-feign调用接口写法总结 阅读详情

首先有几个小知识点需要强调一下:

  • 当方法的参数是对象时,参数其实是对象引用的拷贝
  • 对象的hashCode是两个对象equals的依据,但hashCode相等不代表他们是同一个对象。
  • 验证两个对象是否是同一个对象,可以使用“==“。

先上出现问题的代码
feign接口

import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Map;
import java.util.Set;

@FeignClient("${fxp.my-server}")
public interface IServer {
    @RequestMapping(value = "/testjson",method = RequestMethod.POST)
    Object testJson(@RequestBody JSONObject params);//注意实现时参数中的@RequestBody不会被实现类继承
}

实现类

@RestController
public class MyServer implements IServer{
    @Override
    public Object testJson(@RequestBody JSONObject params) {
        JSONObject context = parseContextFromParam(params);
        context.put("a","abc");
        return params;
    }
    private JSONObject parseContextFromParam(JSONObject params) {
    if (!params.containsKey("context")) {
        throw new MyException(
                CodeMessageEnum.ILLEGAL_PARAM.getCode(),
                CodeMessageEnum.ILLEGAL_PARAM.getMessage(),
             CodeMessageEnum.ILLEGAL_PARAM.getHttpStatus()
        );
    }
    return params.getJSONObject("context");
}
}

这是我遇到问题的代码(这里只是为了展示问题,采用最简化的代码),这段代码的目的时把传入的param进行简单加工(比如本代码中的给内层的”context”加一个键值对),然后返回给调用者。

在本地进行单元测试时是没有任何问题的,单元测试代码:

@AutoWired
private MyServer myServer;
    @Test
    public void testElements(){
        JSONObject param = new JSONObject();
        JSONObject context = new JSONObject();
        context.put("a","1");
        context.put("b","2");
        param.put("context",context);
        Object result = myServer.testJson(param);
        System.out.println(JSONObject.toJSONString(result, SerializerFeature.WriteMapNullValue));//显示空值键值对
    }

但是通过feign接口调用时就会出现问题,在testJson中不论怎么修改context都无法改变返回值。

差别在哪里呢?

feign接口的调用实际上是走的http协议,在参数传递的时候会经过序列化与反序列化的过程,最后我们在参数里边得到的JSONObject的结构可能会不一样。如图
这里写图片描述
在反序列化时spring会使用MappingJackson2HttpMessageConverter实现类(如果没配置你的参数中对应的converter的话),而Jackson在反序列化的时候会将内层的context解析成LinkedHashMap。

接下来看一下我们使用的fastjson的getJSONObject的实现,如下:

    public JSONObject getJSONObject(String key) {
        Object value = map.get(key);

        if (value instanceof JSONObject) {
            return (JSONObject) value;
        }

        if (value instanceof String) {
            return JSON.parseObject((String) value);
        }

        return (JSONObject) toJSON(value);
    }

在toJSON中
这里写图片描述
如果是LinkedHashMap的话getJSONObject方法会返回一个新的对象。
所以上面的代码不管怎么设置context都不会影响最终的结果。

FeignClient调用接口接收不到参数问题 FeignClient调用接口接收不到参数问题1. 问题描述2. 问题分析3. 测试验证3.1 环境依赖3.2 代码实现4. 结论总结5. 阿里开发手册 1. 问题描述 问题就是通过FeignClient调用某个接口的时候,请求参数明明有值,服务端拿到的请求对象却为null。 2. 问题分析 FeignClient接收不到参数可能会存在以下原因, 1.客户端没有传值。 2.客户端与服务端参数类型不一致导致服务端接收不到。 3.请求对象中含有以is开头的参数,FeignClient框架序列化会过滤掉。 4.F 阅读详情

相关推荐

Feign 调用第三方接口示例,FeignClient参数动态配置url、超时时间配置

本文示例了两种feign使用,动态url需要依赖spring的@Vallue注解、@RequestLine注解实现

Be_insighted的博客 1万+

Feign的post请求参数设置

feign的post和get请求 之前写的一篇博文,这次发现有个小问题,修改了,顺便把测试用例粘贴上来。 controller的方法: @PostMapping("/testPost") public TModel<?> testReward(@RequestBody JSONObject body){ System.out.println("done"); System.out.println(body.toJSONString());

weixin_45614626的博客 2948

HttpURLConnection解决Feign报400问题

问题描述 项目中使用Feign组件远程调用问题记录,本地代码执行正常,部署到服务器访问调用不了远程接口,报 feign.FeignException: status 400 reading,不太清楚是什么问题,分别用了httpclinet、resttemplate、feign,结果都失败报同一个问题,明明本地运行正常,线上就不正常了呢? 原因分析: 网上查了很多报错的原因,但是都不符合,最后用了HttpURLConnection这个api 成功解决 解决方案: //post请求 public

~ 1334

Fegin调用使用JSONObject的问题

1.问题描述 fegin发送远程调用,传递的参数中含为com.google.gson.JsonObject的对象。 报错信息: Could not write JSON: JsonObject; nested exception is com.fasterxml.jackson.databind.JsonMappingExce。。。。 请求未到达notify,在fegin...

最后的武艺集大成者 1872

Unsloth Desktop 本地大模型微调量化实战指南

大语言模型的本地化定制正在成为开发者与内容创作者的重要需求,而微调与量化则是其中最关键的两项技术。LoRA 与 QLoRA 通过仅训练少量低秩矩阵,大幅降低显存占用和训练成本,让消费级 GPU 也能完成模型适配;GGUF 格式则打通了训练与推理的边界,使微调后的模型可直接接入 Ollama、llama.cpp 等主流推理引擎。本文以 Unsloth Desktop 为切入对象,从其底层加速原理出发,梳理了环境准备、模型加载、对话测试、量化导出、微调验证及 API 批量调用的完整链路,并针对显存优化、端口冲突

weixin_29055137的博客 397

Kettle实战:如何用JavaScript脚本实现数据库表批量操作(附完整代码)

本文详细介绍了如何利用Kettle的JavaScript脚本实现数据库表批量操作,包括表名采集、循环遍历和动态SQL生成等关键步骤。通过实战案例和完整代码示例,帮助ETL工程师高效处理数据密集型任务,提升数据库操作的自动化水平。

weixin_29019241的博客 232

使用Feign调用form-data的接口

当不想用restTemplate处理form-data接口时,采取以下方式:

黄黄黄黄黄的博客 2100

IAR许可证Generation 18代际不匹配问题解析与解决

IAR Embedded Workbench 的许可证机制采用‘代际(Generation)’模型,而非简单版本号匹配——这是一种基于数字签名算法、加密协议和硬件绑定策略演进的授权安全体系。Generation 18 是 v9.30 及以上版本强制要求的许可代际标准,对应 ECDSA 签名与增强型硬件指纹校验,旨在提升防破解能力与平台适配性。当旧版许可证(如 Generation 16/17)被用于新 IDE 时,启动器会在本地完成代际校验并直接拦截,导致‘The generation feature is

weixin_34203832的博客 344

解决Feign的自定义解码器在接口返回值为void时不执行的问题

项目的接口有一个全局的响应包装器,将接口的所有返回,包括各种类型如List、Entity,或者void,以及抛出的异常,封装成统一的结构给到前端,所以在使用Feign发起远程调用的时候,需要一个自定义的解码器,来对正常的返回值做一个拆包处理,同时对可能返回的异常重新抛出。通过debug查看接口的调用栈,发现接口在执行的时候,会经过一个AsyncResponseHandler的类处理,然后执行一个判断是否为空的方法isVoidType,目测跟我们遇到的问题有关联。

m0_37298252的博客 2461

Netapp FAS2750热备盘替换失败问题分析与解决

本文深入分析了Netapp FAS2750存储系统中热备盘替换失败的故障现象,揭示了磁盘分区属主不匹配导致数据同步无法启动的根本原因。通过详细的排查步骤和解决方案,帮助运维人员快速恢复aggr状态,并提供了长期预防措施和最佳实践建议,确保存储系统的高可用性。

weixin_33737774的博客 399

Tube-based MPC完全指南:RCI集合构造与Matlab实现

模型预测控制(MPC)在实际工程中常因模型失配和外部扰动导致硬约束被突破,而鲁棒控制中的Tube-based MPC通过将单条预测轨迹扩展为“管道”集合,为不确定性提供了严格的安全边界。其核心在于利用鲁棒控制不变集(RCI)离线构造安全域,再结合在线标称MPC与反馈校正实现约束的硬保证。针对非线性系统,利普希茨条件为等效扰动的放大和RCI的构造提供了理论基础,使得算法既能保留非线性描述,又不牺牲在线计算效率。该方法适用于带扰动和参数漂移的机械系统、过程控制及嵌入式控制场景。本文以摩擦力非线性系统为例,从RC

weixin_32642109的博客 216

关于Feign调用 远程调用接口 (实例)

关于Feign调用在最佳用法

wwy11123的博客 325

开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述

综上,大多数工作均基于CLIP预训练的图像编码器和文本编码器。GlIP为解决目标检测任务提供了先例,后续很多工作常与目前较为广泛使用的目标检测网络结构相结合,从而构建新的开放词汇目标检测器。如ViLD基于Mask R-CNN、RegionCLIP基于R-CNN、VLDet和BARON基于Faster R-CNN。更具有创新性的工作是Detic,提出了使用图像分类的数据集来对目标检测器的分类头进行训练。

yangsn0719的博客 4402

2021-08-11 feign获取JSONObject数据后的处理

feign获取JSONObject数据后的处理 先写两个获取解析结果的类 @Data public class HttpResponse<T> { private String msg; private Integer code; private HttpResult<T> result; public T getData() { if (null != result) { return result.ge

turbos_的博客 843

YOLOv11 改进 - 特征融合 | 小目标检测救星:DySample动态上采样减少特征丢失

本文介绍了超轻量且高效的动态上采样器DySample与YOLOv11的结合,以解决传统上采样器工作负载大、应用场景受限的问题。DySample从点采样角度构建上采样,绕过动态卷积,使用PyTorch标准内置函数实现,无需定制CUDA包,能大幅减少参数、FLOPs等资源消耗。我们将DySample代码集成进YOLOv11。实验脚本显示,结合DySample的YOLOv11在多个密集预测任务中或表现出色。

魔改工程师的博客 1416

YOLOv11训练:Roboflow免费数据集获取与格式转换超详细教程

公共数据集库:包含超过20,000个开源数据集数据标注工具:支持在线标注和团队协作数据预处理:自动增强、扩充和格式化版本控制:像管理代码一样管理数据集版本多格式导出:支持所有主流目标检测格式import cv2# 加载图像# 加载标注# 数据增强# 调整尺寸# 调整标注坐标# 转换为Tensor# 实现保持长宽比的resize逻辑pass# 坐标转换逻辑pass# 数据增强实现pass数据集选择优先选择Roboflow上标注质量高的官方数据集。

weixin_39818775的博客 2362

fegin 传JsonObject 、传Long[]问题

试了各种方法,最后还是用把Json对象转成String 如果有成功的,欢迎留言,谢谢 @Service @FeignClient(name = "service-order") //@RequestMapping("orderService") public interface FOrderServer { // //改订单状态为验货中 // @Post...

qq690452074的专栏 1518

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java后端通过hutool接口发请求

Java后端通过hutool发请求

我从不打没有准备的仗! 9447

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

在 Feign 调用 中模拟 Swagger 请求

本文介绍了在Feign调用中模拟Swagger请求的方法。关键是通过Gson或Hutool构建与Swagger请求体一致的JSON结构:1)当参数为JSON对象时直接构建嵌套结构;2)当参数需要JSON字符串时(如阿里云短信接口),需将对象转为字符串。文章对比了不同数据类型的处理方式,并强调必须根据Swagger文档确定参数类型(对象或字符串)。最后提供了完整的Gson实现示例,包括构建嵌套JSON、转为字符串、设置DTO和Feign调用的全流程。正确构建请求体可避免序列化错误,确保请求与Swagger完全

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 174

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

如何让Feign支持Enum的对象!

如何让Feign支持Enum的对象!Enum的序列化!FeignClient调用解决枚举接收问题方法一、使用JSONObject对象接收方法二、直接使用VO泛型对象接收 Enum的序列化! 可对DTO通过alibaba.fastjson的注解来达到序列化的目标,在字段中增加 @JSONField(serialzeFeatures = {SerializerFeature.WriteEnumUsingToString}) private UserTypeEnum userType; FeignClient调

无情的你,无情的雨! 8581

使用feign发起post请求出现411 Length Required Error

使用feign发起post请求出现HTTP Error 411. The request must be chunked or have a content length.

AimerRhythm 3171

Feign自定义日志

此章节介绍了自定义Feign 日志输出,通过实现工厂类接口和继承类,还使用了slf4j日志工具,在项目开发过程中建议使用slf4j这样项目在更换日志框架也不用修改源代码了,扩展性更强。

2301_77804289的博客 409

feign和ajax,feignclient发送get请求,传递参数为对象(示例代码)

feignclient发送get请求,传递参数为对象。此时不能使用在地址栏传递参数的方式,需要将参数放到请求体中。第一步:修改application.yml中配置feign发送请求使用apache httpclient 而不是默认的jdk UrlConnectionfeign.httpclient.enabled= true第二步:pom.xml中增加对apache httpclient的支持。o...

weixin_30005929的博客 405

调用feign api接口对象强转 报 java.util.LinkedHashMap cannot be cast to

调用feign api接口对象强转 java.util.LinkedHashMap cannot be cast to 这个报错是因为在定义接口返回值的时候没有指定类型,解决方法有两种 接口指定返回值类型,如下所示: RpcResult<AssetEnableRes> getAssetValue(@RequestBody AssetEnableReq freezeAssetReq...

微信公众号《后端学长》 3845

Feign 调用对象时:JSON parse error:Cannot deserialize value of type `java.util.Date` from String

在使用feign调用其他服务接口时,如果对象存在Date类型就会报错Cannot deserialize value of type java.util.Date from String 解决方法1:在调用端的model类上加上注解,必须有无参构造器 @JsonFormat(pattern = “yyyy-MM-dd”, timezone = “GMT+8”) @FeignClient(value = "${feignTestArms}",fallbackFactory = FeignClientTestF

weixin_43866043的博客 4382

SpringCloud的feign调用第三方公司提供的接口并按照指定对象类型返回

我从网上找了个接口的提供方 里面的接口有很多免费的哦! 分享一下: https://www.juhe.cn/ 注册完账号申请个接口 用来测试 举例 会有个Key保存好用得到 点进去看API文档 接下来撸代码: 第一步:引入springcloud的openfeign <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>s

TaoShao521的博客 1816
上一篇: 算法-排序
下一篇: 算法-优先队列与堆排序
PEACEFIRE
博客等级 码龄11年 43粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值