使用feign客戶端做不用服務之間的調用的時候出現了provider獲取不到參數的問題,在此記錄一下。
先來說一下流程: 在我的微服務中,有這麼幾個角色,consumer: 服務的消費者,provider:服務的消費者,還有一個feign,主要就是provider的接口形式,然後consumer依賴了feign,去調用provider中的服務,我在provider中打印獲取的參數,一直爲空。
我這裏,consumer, feign,provider都是單獨的模塊
我們來看下代碼:
首先是provider: 提供了一個保存用戶的服務
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@PostMapping("/save")
public String save(User user){
log.info("provider: 處理save請求,參數爲:{}",user);
return "success";
}
feign代碼:,注意這個模塊要添加feign依賴
@FeignClient(name = "service-provider",fallback = UserHystrix.class)
public interface UserController {
@PostMapping("/user/save")
String save(User user);
}
然後使用consumer通過feign調用provider: 注意 consumer依賴feign,上代碼:
@RestController
@Slf4j
public class FeignController {
@Autowired
private UserController userController;
@RequestMapping("/feign")
public String test(){
User user = new User();
user.setName("zhangsan");
user.setAge(10);
log.info("feign調用開始。。。。");
String result = userController.save(user);
log.info("feign: 返回: {}", result);
return "success";
}
}
各自服務啓動後,瀏覽器調用consumer的 /feign請求,觀察provider日誌,發現獲取到的User參數沒有值。
如何解決: 在provider中的方法裏的User參數前面,加上 @RequestBody ,注意下面代碼中的註釋部分
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@PostMapping("/save")
// 注意加上requestBody,否則容易接收不到參數
public String save(@RequestBody User user){
log.info("provider: 處理save請求,參數爲:{}",user);
return "success";
}
}
好了,爲了方便大家觀看,在給出以下項目結構吧:
好了,希望對大家有幫助