前提
使用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請求,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/232856.html
標籤:Java
上一篇:9 宣告式事務
下一篇:嗯!這篇多執行緒不錯!伍
