好久没写博客了,今天趁着周末把工作中遇到的问题梳理一下(在这个问题排查过程中,发现自己排查问题的能力还是太弱了,需要加强)。

  最近在公司springCloud的项目里,通过feign远程调用其他服务,代码如下,可以看到,这里的RequestHeader里面我传了String类型的tenantId,测试的时候没有问题,但是项目上线后,发现部分用户在调用这个接口的时候返回的不是想要的结果,当然大部分用户使用的时候是正常的。然后我们就打印了日志,查看了调用链路,发现只要RequestHeader里面的tenantId为null的时候,就会出错,client传递的tenantId为null的时候,server收到的参数为“{tenantId}”,你没看错,就是在参数的key上面加了大括号。这个有点匪夷所思了。

/**
* 查询用户动态提额(仅限卡面使用)
* @param tenantId
* @param paramJson
* @return
*/
@RequestMapping(value = "${wk.url.quota}/api/quota/findDynamicQuotaByCustomerId", method = RequestMethod.POST)
String findDynamicQuotaByCustomerId(@RequestHeader String tenantId, @RequestBody JSONObject paramJson);

  通过排查,查资料,发现是由于feign底层的源码的问题,见下面红色字体部分。当时我们用的springCloud版本是Finchley.SR2。但是新版的springCloud里面已经修复了这个问题。

public static String expand(String template, Map<String, ?> variables) {
// 如果没有设置有效变量,则跳过扩展。
if (checkNotNull(template, "template").length() < 3) {
return template;
}
checkNotNull(variables, "variables for %s", template);
boolean inVar = false;
StringBuilder var = new StringBuilder();
StringBuilder builder = new StringBuilder();
for (char c : template.toCharArray()) {
switch (c) {
case '{':
if (inVar) {
// '{{' 是转义字符,不进行解析
builder.append("{");
inVar = false;
break;
}
inVar = true;
break;
case '}':
if (!inVar) {
builder.append('}');
break;
}
inVar = false;
String key = var.toString();
//这里的variables就是header的map,由于header中的name值为null,所以这里只有一个key-value
Object value = variables.get(var.toString());
if (value != null) {
builder.append(value);
} else {
//“罪魁祸首”就在这里,又把初始化时的默认值返回了
builder.append('{').append(key).append('}');
}
var = new StringBuilder();
break;
default:
if (inVar) {
var.append(c);
} else {
builder.append(c);
}
}
}
return builder.toString();
}

  所以解决办法很简单:1)升级springCloud版本;2)使出入的参数不能为null。

参考博客:https://www.jianshu.com/p/550fb3b5f533

springCloud的feign异常:RequestHeader参数为空时,对key加了大括号{}的更多相关文章

  1. mybatis hashmap 输入键值对为空时,key 丢失

    参考文档:https://blog.csdn.net/lulidaitian/article/details/70941769 springMVC+mybatis查询数据,返回resultType=” ...

  2. Mybatis返回值类型是hashmap,输入键值对为空时,key 丢失的问题

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...

  3. SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer);

    SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer); 第一种方法: 如果你 ...

  4. springcloud 之 feign的重复性调用 优化

    最近有一个springcloud的feign请求,用于获取坐标经纬度的信息,返回结果永远是固定不变的,所以考虑优化一下,不然每次转换几个坐标都要去请求feign,返回的所有坐标信息,数据量太大导致耗时 ...

  5. ReadyAPI/soapUI发送post请求json格式(带有中文字符),后台获取参数为空

    解决:请求编码格式默认为空,在"TestCase"的指定Step的Request Properties中, 改Encoding编码格式为UTF-8. 原文:soapUI发送post ...

  6. 如何使用Feign构造多参数的请求

    原文:http://www.itmuch.com/spring-cloud-sum/feign-multiple-params/ 本节来探讨如何使用Feign构造多参数的请求.笔者以GET及POST请 ...

  7. SpringCloud之Feign声明式调用原理及配置

    1 什么是Feign Feign是一种声明式.模板化的HTTP客户端(仅在Application Client中使用).声明式调用是指,就像调用本地方法一样调用远程方法,无需感知操作远程http请求. ...

  8. SpringCloud使用feign时的复杂参数传递(转)

    Feign传参注意 最近在用SpringCloud尝试重构以前的项目,使用Feign客户端组件来调用微服务,经常出现参数传不过去变成null的问题,网上查了一下发现feign在参数上的使用还是有一定的 ...

  9. springmvc 参数校验/aop失效/@PathVariable 参数为空

    添加依赖 <!-- 参数校验 --> <dependency> <groupId>org.hibernate.validator</groupId> & ...

随机推荐

  1. <JavaScript> 匿名函数和闭包的区别

    匿名函数:没有名字的函数:并没有牵扯到应用其他函数的变量问题.仅仅是没有名字. 定义方式: 1,var A = function(){ }; 2, (function (x,y){ })(2,3); ...

  2. vue2.0中 怎么引用less?

    vue2.0中  怎么引用less? 第一步: 安装less依赖, npm install less less-loader --save 第二步: 修改webpack.config.js文件,配置l ...

  3. Swift 常量

    常量一旦设定,在程序运行时就无法改变其值. 常量可以是任何的数据类型如:整型常量,浮点型常量,字符常量或字符串常量.同样也有枚举类型的常量: 常量类似于变量,区别在于常量的值一旦设定就不能改变,而变量 ...

  4. Smarty 获取当前日期时间和格式化日期时间

    在Smarty 中获取当前日期时间和格式化日期时间与PHP中有些不同的地方,这里就为您详细介绍: 首先是获取当前的日期时间:在PHP中我们会使用date函数来获取当前的时间,实例代码如下:date(& ...

  5. MapReduce编程实例

    MapReduce常见编程实例集锦. WordCount单词统计 数据去重 倒排索引 1. WordCount单词统计 (1) 输入输出 输入数据: file1.csv内容 hellod world ...

  6. CockroachDB学习笔记——[译]为什么Go语言是CockroachDB的正确选择

    原文链接:https://www.cockroachlabs.com/blog/why-go-was-the-right-choice-for-cockroachdb/ 原作者:Jessica Edw ...

  7. Centos7 系统更改apache默认网站目录(解决You don't have permission to access / on this server问题)

    当我们在Centos7中配置好Apache时,发现apache默认解析目录是在 /var/www/html,也就是说当访问服务器 IP 或者本地 localhost 时, 默认定位到这个目录里的 in ...

  8. Docker三

    将本地镜像发布到阿里云 有时候需要共享镜像或者习惯使用自己定义的镜像,可以注册私有仓库,国内推荐使用阿里云 步骤: 1.登录阿里云容器镜像服务:https://cr.console.aliyun.co ...

  9. 分布式消息通信之RabbitMQ_02

    目录 1. 可靠性投递分析 1.1 消息投递 1.2 消息路由 1.3 消息存储 1.4 消息消费 1.5 其他 2. 高可用架构部署方案 2.1 集群 2.2 镜像 3. 经验总结 3.1 配置文件 ...

  10. 基于Keras 的VGG16神经网络模型的Mnist数据集识别并使用GPU加速

    这段话放在前面:之前一种用的Pytorch,用着还挺爽,感觉挺方便的,但是在最近文献的时候,很多实验都是基于Google 的Keras的,所以抽空学了下Keras,学了之后才发现Keras相比Pyto ...