首先解决问题:
问题:微服务之间的api调用出现为服务方提供参数传值的时候出现了传值丢失的问题,
排查:在服务方的api接口写的时候参数值没有添加参数类型注解导致传值丢失。
如:服务B里面的Api接口,
没有添加@RequestParam(name = "benefitId")
@ApiOperation("列表") @GetMapping("/v1/getBenefitPropInfo") BenefitProprietorVO getBenefitPropInfo(Long benefitId);
则在服务a里面调用的话是以Http请求的url方式去请求调用的,这样的形式在调用方那边就调用的是http.../v1/getBenefitPropInfo
没有识别到有参数则这边便会默认这个方法是没有参数的,所以即使你把值传过去,也是无效的。服务方在http请求里面无法查找到相关的参数;
加了 @RequestParam(name = "benefitId")
则是为方法提供了一定的参数识别,即告诉那边说你需要的参数是什么,调用方才会把参数加入请求的url上面
所以本次问题的解决方案是把@RequestParam(name = "benefitId") 加上就能正常接收参数了。
顺便长点见识:
问题总是试着试着就弄好了,但是其中缘由却没能理解透彻,也不知为什么这样就能处理就可以那样也不可以。
总之所有的问题都是你的姿势不对造成的,你的姿势决定你的bug数目,我是在看另外一个问题的时候想起了这个问题的原因,其实这个服务方那边无法接收参数也是有一定出入的。
其中主要涉及了一个@RequestParam加与不加的区别,明白了这个区别以及其中调用原理便能明白其中的问题。
一般编写controller层的时候都是默认带上 @RequestParam 编写api也是,但是其实不加@RequestParam 也能接收到参数
加与不加的区别主要如下
这里有两种写法
@RequestMapping("/list")
public String test(@RequestParam Long parentId) {
}
@RequestMapping("/list")
public String test( Long parentId) {
}
第一种必须带有参数,你直接输入localhost:8080/list 会报错 不会执行方法 只能输入localhost:8080/list?parentId=? 才能执行相应的方法
设置 @RequestParam 里面的required为false(默认为true 代表必须带参数) 这样就跟第二种是一样的了@RequestParam(required=false)
可以设置里面的defaultValue的属性
如下: @RequestParam(defaultValue="0")
这样在地址里面也可以不带参数,如果带了参数会接收,不带参数会默认为0
第二种 不加 @RequestParam,可带参数也可不带参数 你输入 localhost:8080/list 以及 localhost:8080/list?parentId=? 方法都能执行
但是这种写法是有一定的风险的,大佬给我讲解的其中原理是,这里面的参数定义在编译的时候是容易被擦除掉的,在请求的时候他需要值就会去header里面找或者到body里面找,但是找到的不一定会是对应的参数,也有可能是一些乱七八糟的东西,如果前端传过来的参数是带了?parentId=?的这边就会默认获取?号后面的第一个就会出现数据不对应等问题,一个的话还可以,但是如果是多个参数的话就容易报错,
所以还是加上@RequestParam避免会出现很多奇奇怪怪的问题。