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

posted on   乐之者v  阅读(924)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用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的错误提示
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示