記一次 feign.FeignException: status 404 reading xxx 問題解決

通過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爲例,如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章