通過FeignClient調用服務,出現以下錯誤:
出現404第一反應是服務沒有訪問到,於是檢查路徑,發現 client確實少了一個/sysResource/,錯誤版如下:
@FeignClient(value = "mlyun-uc", primary = false)
public interface SysResourceClient {
@PostMapping("addSysResource")
public JsonResult addSysResource(@RequestBody AddSysResourceRequest addSysResourceRequest);
}
於是改成下面的正確路徑(/sysResource/addSysResource):
@FeignClient(value = "mlyun-uc", primary = false)
public interface SysResourceClient {
@PostMapping("/sysResource/addSysResource")
public JsonResult addSysResource(@RequestBody AddSysResourceRequest addSysResourceRequest);
}
再次請求發現還是報這個404的錯, 路徑已經修改正確了,於是檢查Controller,未修改前的Controller如下:
@RestController
@RequestMapping(value = "/column")
public class ColumnController {
@Autowired
SysResourceClient sysResourceClient;
@PostMapping("addSysResource")
public JsonResult addSysResource(AddSysResourceRequest addSysResourceRequest) {
return sysResourceClient.addSysResource(addSysResourceRequest);
}
}
想看看傳參有無問題,於是加上了@Valid註解:
@RestController
@RequestMapping(value = "/column")
public class ColumnController {
@Autowired
SysResourceClient sysResourceClient;
@PostMapping("addSysResource")
public JsonResult addSysResource(@Valid AddSysResourceRequest addSysResourceRequest) {
return sysResourceClient.addSysResource(addSysResourceRequest);
}
}
再次請求,報錯如下:
這明顯是傳參有問題啊,仔細檢查發現client是@RequestBody註解的,於是加上@RequestBody,再次請求,成功!
總結:
出現404,網上更多的都說是路徑有問題,服務沒有被找到,當然這可能是大概率原因,實際上如果參數爲空或者形式不多也會報這個錯。因此,遇到這樣的問題可以從兩個方面入手:一是路徑,二是傳參。
正確的形式如下:
@FeignClient(value = "mlyun-uc", primary = false)
public interface SysResourceClient {
@PostMapping("/sysResource/addSysResource")
public JsonResult addSysResource(@RequestBody AddSysResourceRequest addSysResourceRequest);
}
@RestController
@RequestMapping(value = "/column")
public class ColumnController {
@Autowired
SysResourceClient sysResourceClient;
@PostMapping("addSysResource")
public JsonResult addSysResource(@Valid @RequestBody AddSysResourceRequest addSysResourceRequest) {
return sysResourceClient.addSysResource(addSysResourceRequest);
}
}
另外,還要注意@RequestBody的傳參方式,以postman爲例,如下: