Feign调用报错status 404
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路径,但是没有ip和端口。继续往下调试。
点击 execute()方法,可以看到 Client类的execute() 方法如下,
public Response execute(Request request, Options options) throws IOException {
//在这里打个断点,看一下request里面的url 是什么
HttpURLConnection connection = this.convertAndSend(request, options);
return this.convertResponse(connection).toBuilder().request(request).build();
}
错误原因:
url不对的原因有可能是:
- 服务消费者调用的url,跟服务提供者的url不一样
仔细检查一下url的路径。
- 服务消费者调用时,@FeignClient注解的 name/value 属性写错了,与 服务提供者配置的context-Path(上下文)不一致。
@FeignClient注解的 name/value属性,会指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现。
name/value属性写错了,就会报错404。
解决方法:
- 修正url,让服务消费者调用的url,与服务提供者的url保持一致。
仔细检查下 @RequestMapping 组成的 url,是否正确。
修改服务消费者的url,如果服务提供者的url允许修改,也可以修改服务提供者的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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-05-04 java8 日期Date、LocalDate、LocalDateTime、字符串String的转换
2022-05-04 每月摘录--2022年4月
2020-05-04 《Kafka权威指南》读书笔记
2018-05-04 IntelliJ Idea解决Could not autowire. No beans of 'xxxx' type found的错误提示