前提
使用OpenFeign构建微服务消费端,发送带参请求时,控制台报错:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.FeignException$InternalServerError: [500 ] during [GET] to [http://user-provider/user/isConsumerId] [UserConsumerService#isID(Integer)]: [{"timestamp":"2020-12-10T06:44:07.262+00:00","status":500,"error":"Internal Server Error","message":"","path":"/user/isConsumerId"}]] with root cause
方法
在传参数时需要添加@RequestParam(“paramName”)
,或者在调用的API的接口中添加@RequestParam(“paramName”)
也可。
如果只在API中加@RequestPara(“paramName”),“paramName” 必须指定,否则,构建接口实例时报错。
如果在API和provider以及consumer相关参数前加@RequestPara(“paramName”)注解,则“paramName” 可以不指定。
ps:最好在API、provider、consumer相关参数前全加上
@RequestParam
实例
以下为不同服务:
user-api:
@RequestMapping("/user")
public interface RegisterApi {
@GetMapping("/isConsumerId")
String isID(/*@RequestParam("id")*/ Integer id);
}
user-provider:
@RestController
public class UserController implements RegisterApi {
@Override
public String isID(Integer id) {
if (id == 1) return "find " + id;
else return "not find " + id;
}
}
user-consumer:
package com.yiming.user_consumer.service;
@FeignClient(name = "user-provider")
public interface UserConsumerService extends RegisterApi {
@GetMapping("/isConsumerId")
String isID(@RequestParam("id") Integer id);
}
package com.yiming.user_consumer.controller;
@RestController
public class ConsumerFindIDController {
@Autowired
UserConsumerService consumerService;
@GetMapping("/findById")
public String findId(Integer id) {
return consumerService.isID(id);
}
}
原因
isID(@RequestParam("id") Integer id)
,实际上是交由Feign组装get请求 http://user-provider/isConsumerId?id={1}
,此时@RequestParam("id")是强制要求的,否则报错。
扩展:
若需动态传参,可将参数放入map中,如下所示:
user_api:
@RequestMapping("/user")
public interface RegisterApi {
@GetMapping("/map")
Map<String, Object> getMap(Map<String, Object> map);
}
user-provider:
@RestController
public class UserController implements RegisterApi {
@Override
public Map<String, Object> getMap(@RequestParam Map<String, Object> map) {
System.out.println(map);
return Collections.singletonMap(map.get("name").toString(), Integer.parseInt(map.get("age").toString()));
}
}
user-consumer:
package com.yiming.user_consumer.service;
@FeignClient(name = "user-provider")
public interface UserConsumerService extends RegisterApi {
@GetMapping("/map")
Map<String, Object> getMap(@RequestParam Map<String, Object> map);
}
package com.yiming.user_consumer.controller;
@RestController
public class ConsumerFindIDController {
@Autowired
UserConsumerService consumerService;
@GetMapping("/getMap")
public Map<String, Object> getMap(@RequestParam Map<String, Object> map) {
return consumerService.getMap(map);
}
}
还有一个坑:
当传参为空时,get请求被Feign转为post请求。。。