现象
-
有一个spring boot 服务,对外提供查询的接口
-
另外3个服务分别去调用这个接口
-
2个tomcat的服务,调用成功
-
1个jar启动的spring boot服务,调用失败,参数传递不过去
-
关键报错日志
Required Long parameter 'userId' is not present
,日志截图如下:
-
接口是通的,但是参数值传递失败,对方只接收到
null
值,导致报错提示 -
FeignClient里面的接口
@RequestMapping(value = "/api/auth/loader/user/loadSystemMenu", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
List<AuthMenuVO> loadSystemMenu(@RequestParam(name = "userId") Long userId, @RequestParam(name = "sysCode") String sysCode);
- 实现类
@RequestMapping(value = "loadSystemMenu")
public List<AuthMenuVO> loadSystemMenu(@RequestParam(name = "userId") Long userId, @RequestParam(name = "sysCode") String sysCode) {
List<AuthMenuVO> menuVOList = authMenuService.getUserMenuBySysCode(userId, sysCode);
return menuVOList;
}
剖析
- 该接口功能没问题,因为另外2个tomcat服务调用都成功了,参数传递也没问题。失败的是内置tomcat使用jar启动的spring boot工程,应该是和spring注解或相关默认配置有关
- 该接口注明是
POST
方式,但是调用方使用的是默认的get
方式 - 实现类上有
@RequestParam
注解,这个是get方式需要用到的
解决
- 第一次尝试,将
Long
改为long
,由包装类型改为基本类型,无用 - 第二次尝试,将实现类的
@RequestParam
注解去除,不报错了,但是值传不过去 - 第三次尝试,将接口里的调用方式
post
改为get
,成功
总结
- 参数传递失败时,需要将post请求,改为get请求
- 具体原因还在探究中,怀疑是
spring boot
里的哪些默认配置,限制了POST
方式使用@RequestParam
,后续有时间再深入源码继续测试