feign
feign copied to clipboard
Unexpacted exception 404 Not Found
Hello, I have some questions about using Feign in Spring Cloud. I have a FeignClient:
@FeignClient(name = "device-code", url = AzureTokenClient.BASE_URL)
public interface AzureTokenClient {
String SCOPE = URLEncoder.encode("offline_access files.read.all", Charsets.UTF_8);
String BASE_URL = "https://login.microsoftonline.com";
@PostMapping(value = "/common/oauth2/v2.0/devicecode", consumes = "application/x-www-form-urlencoded")
Map<String, Object> getDeviceCode(@RequestBody Request dto);
}
record Request(
@RequestParam(name = "client_id") String clientId,
@RequestParam(name = "scope") String scope
) implements Serializable { }
But when I call function DeviceCodeCheckClient#getTokenByDeviceCode, it throw feign.FeignException$NotFound:
10:29:28.267 ERROR (DirectJDKLog.java:175): Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.FeignException$NotFound: [404 Not Found] during [POST] to [https://login.microsoftonline.com/common/oauth2/v2.0/devicecode] [AzureTokenClient#getDeviceCode(Request)]: []] with root cause
feign.FeignException$NotFound: [404 Not Found] during [POST] to [https://login.microsoftonline.com/common/oauth2/v2.0/devicecode] [AzureTokenClient#getDeviceCode(Request)]: []
at feign.FeignException.clientErrorStatus(FeignException.java:219)
at feign.FeignException.errorStatus(FeignException.java:194)
at feign.FeignException.errorStatus(FeignException.java:185)
...
Obviously, the link https://login.microsoftonline.com/common/oauth2/v2.0/devicecode is correct and accessible. I would like to know why Feign is giving error 404 and how can I fix this? Thank you!
The annotation @RequestBody will serialize the object to json or xml, but consumes specifies the format as application/x-www-form-urlencoded, which causes the body in the request sent by Feign to be empty, so the microsoft server returns a 404 Not Found response.
To solve this problem, the @RequestBody annotation should be removed:
@PostMapping(value = "/common/oauth2/v2.0/devicecode", consumes = "application/x-www-form-urlencoded")
Map<String, Object> getDeviceCode(Request dto);
Looks like you figured it out. 👍🏻