feign调用报错status 404
使用feign,报错:FeignException: status 404。如下:
Caused by: feign.FeignException: status 404 reading #;
at feign.FeignException.errorStatus(FeignException.java:62)
at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:91)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76)
at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:108)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
Debug
跟踪查看方法栈中的方法,报错代码 SynchronousMethodHandler类的 executeAndDecode()方法 如下:
可以看到 发送了一个请求,获取响应。可以在 response = this.client.execute(request, this.options); 打个断点,看一下
request请求的url是什么。
Object executeAndDecode(RequestTemplate template) throws Throwable {
Request request = this.targetRequest(template);
if (this.logLevel != Level.NONE) {
this.logger.logRequest(this.metadata.configKey(), this.logLevel, request);
}
long start = System.nanoTime();
Response response;
try {
//发送请求,获取响应
//可以在这里打个断点,看一下request请求的url是什么。
response = this.client.execute(request, this.options);
response.toBuilder().request(request).build();
} catch (IOException var15) {
if (this.logLevel != Level.NONE) {
this.logger.logIOException(this.metadata.configKey(), this.logLevel, var15, this.elapsedTime(start));
}
throw FeignException.errorExecuting(request, var15);
}
}
调试的示例如下,可以在调试中发现 request 中的 url是什么:
错误原因:
url不对的原因有可能是:
- 服务消费者调用的url,跟服务提供者的url不一样
仔细检查一下url的路径。
- 服务消费者调用时,@FeignClient注解的 name/value 属性写错了,与 服务提供者url的contextPath(上下文)不一致。
@FeignClient注解的 name/value属性,会指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现。
比如:服务提供者的url是 /user/detail,而服务消费者使用feign时,@FeignClient注解的 name/value属性指定为 my-service,那么服务消费者调用的url就是 /my-service/user/detail,两边不一致。
name/value属性写错了,就会报错404。
解决方法:
- 修正url,让服务消费者调用的url,与服务提供者的url保持一致。
仔细检查下 @RequestMapping 组成的 url,是否正确。
- 修正 @FeignClient注解的 name/value属性,让url保持一致。
仔细检查下服务消费者的 @FeignClient注解的 name/value属性, 是否与服务提供者的contextPath(上下文)一致。
- 如果还是不行,通过 @FeignClient注解的 url 属性,直接指定 url。
比如用properties文件配置(或者配置中心配置)一个变量 my.url 指定 url,不同的环境可以配置不同的url。
变量 my.url 后面的:表示默认值。
直接指定url,就不会受到 @FeignClient注解的 name/value属性的影响。
如下 :
@FeignClient(name = "my-service", url = "${my.url:localhost:5001/user/}" )
public interface MyServiceApi {
@PostMapping("/detail")
void send(@RequestBody Body body);
}
参考资料:
https://blog.csdn.net/sinat_38332832/article/details/119814245
标签:status,FeignClient,feign,name,url,request,value,404,报错 From: https://www.cnblogs.com/expiator/p/17372743.html