feign.FeignException: status 404 reading xxService#xxmethod(Integer)

本文解决了一个SpringCloud项目中Feign客户端调用时参数传递的问题。原本参数未能正确传递给服务提供者,通过在服务提供者和客户端中使用@RequestParam注解来明确指定请求参数,最终解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring cloud 项目在feign client 调用时候用到标题错误

服务提供者

 @RequestMapping(value="/getMessageqqtest",method= RequestMethod.POST)
  public String TestMessage2(Integer num) {
      return mrc.getMessage(num+2000);
  }

feign client 调用方

@FeignClient(value = "horus-zuul-server")
public interface MessageResultFacade{
	@RequestMapping(value = "/chaosclient-service-provider/getMessageqq", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
	String getMessage(Integer num);
}

 

经过分析 发现是参数没有传过去 参数传到控制器端为null

参考网上思路 要加上requestparam 修改如下

提供者

  @RequestMapping(value="/getMessageqqtest1",method= RequestMethod.POST)
  public String TestMessage21(@RequestParam Integer num) {
      return mrc.getMessage(num+2000);
  }

 

feign 调用方

 

@FeignClient(value = "horus-zuul-server")
public interface MessageResultFacade{
	@RequestMapping(value = "/chaosclient-service-provider/getMessageqq", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
	String getMessage(@RequestParam("num") Integer num);

 

 

<think>好的,我现在需要帮用户解决Feign调用远程服务时报404错误的问题。用户提到具体的错误是feign.FeignException$NotFound,发生在UserFeignService的register方法,远程服务执行完毕但本地报错。根据用户提供的引用和之前的回答,我需要整理出可能的原因和解决方案。 首先,回顾之前的回答,用户提到的404错误可能涉及路径问题、服务发现配置、编码器缺失或请求头设置。现在需要结合用户提供的引用内容来进一步分析。引用[1]和[2]都提到404错误通常是因为接口路径不匹配或服务名错误。引用[3]指出可能缺少HttpMessageConverter,引用[4]提到Consul配置中的端口问题。 接下来,我需要按照之前的步骤结构,分步骤详细说明可能的原因和解决方案。可能需要包括路径检查、服务发现配置、编码器设置、请求头处理以及日志调试等。同时,要确保解决方案具体,比如给出配置示例或代码片段,方便用户操作。 还要注意用户之前的问题中提到的远程服务已执行完毕,但本地报错,这可能涉及超时或响应处理的问题,但根据当前错误是404,更可能还是路径或服务名的问题。需要提醒用户检查Feign客户端和服务端的路径是否一致,包括请求方法、路径参数、查询参数等。此外,服务注册与发现是否正确,比如Consul的服务名是否正确,端口配置是否无误。 另外,引用[3]提到的编码器缺失可能导致Multipart请求处理失败,进而引发404,但如果是register方法,可能涉及POST请求,需要确认是否有正确的编码器配置。比如上传文件时需要Multipart支持,否则可能导致路径错误。 还需要考虑是否需要自定义错误解码器,如之前回答中的BizErrorDecoder,但404更可能是路径或服务发现问题,而不是业务异常。 最后,要确保回答结构清晰,步骤明确,每个可能的原因都有对应的检查方法和解决建议。同时,相关问题要围绕用户可能遇到的后续问题展开,比如服务注册、负载均衡、重试机制等。</think>#### Feign调用404错误排查指南(针对UserFeignService.register方法) --- ### 一、核心排查路径(按优先级排序) 1. **路径映射验证(占70%案例)** - 检查Feign客户端与服务端**三处路径一致性**: ```java // Feign客户端 @FeignClient(name = "USER-SERVICE") public interface UserFeignService { @PostMapping("/user/register") // 重点检查此处 Result register(@RequestBody UserDTO user); } // 服务端Controller @RestController public class UserController { @PostMapping("/user/register") // 必须完全匹配 public Result register(@RequestBody UserDTO user) { //... } } ``` - **特殊场景排查**: - 路径中存在**路径变量**时需用`@PathVariable`标注 - 使用`@RequestParam`时需确保参数名一致 2. **服务发现验证(Consul/Nacos配置)** - 检查服务注册状态(以Consul为例): ```bash curl http://127.0.0.1:8500/v1/agent/services | jq ``` - **关键配置项**: ```properties # 客户端配置(必须与服务端注册名一致) @FeignClient(name = "USER-SERVICE") # 服务端配置(确保注册到正确名称) spring.application.name=user-service spring.cloud.consul.discovery.service-name=${spring.application.name} ``` 3. **请求头配置(Content-Type问题)** - 当使用`@RequestBody`时需显式声明: ```java @PostMapping(value = "/user/register", consumes = MediaType.APPLICATION_JSON_VALUE) // 必须声明 ``` --- ### 二、进阶排查方案 #### 1. 网络层抓包验证 使用Wireshark捕获实际请求地址: ```shell # 过滤条件示例(假设服务端口8080) tcp.port == 8080 && http ``` 验证实际请求路径是否为: ``` POST /user/register HTTP/1.1 Host: USER-SERVICE ``` #### 2. 启用Feign详细日志 配置日志级别: ```yaml logging: level: feign.Logger: DEBUG ``` 控制台将输出关键信息: ``` --> POST http://USER-SERVICE/user/register HTTP/1.1 Content-Type: application/json;charset=UTF-8 ``` #### 3. 编码器特殊处理 当传输特殊数据类型时需配置编码器(引用[3]案例延伸): ```java @Configuration public class FeignConfig { @Bean public Encoder feignEncoder() { return new SpringFormEncoder(new SpringEncoder(messageConverters)); } } ``` --- ### 三、典型错误场景修复 #### 场景1:路径大小写不一致 ```java // 错误示例(服务端使用大写) @PostMapping("/User/Register") // 正确应改为 @PostMapping("/user/register") ``` #### 场景2:版本路径冲突 ```java // Feign客户端 @FeignClient(name = "USER-SERVICE", path = "/api/v1") // 全局路径 // 服务端Controller @RestController @RequestMapping("/api/v2") // 版本不一致导致404 ``` #### 场景3:负载均衡失效 检查Ribbon服务列表: ```java // 注入负载均衡客户端 @Autowired private LoadBalancerClient loadBalancerClient; public void checkService() { ServiceInstance instance = loadBalancerClient.choose("USER-SERVICE"); log.info("实际调用地址: {}:{}", instance.getHost(), instance.getPort()); } ``` --- ### 四、预防措施 1. **接口契约管理**: - 使用OpenAPI 3.0规范定义接口 - 通过swagger-codegen生成Feign客户端 2. **环境校验脚本**: ```bash # 服务健康检查 curl -X POST http://USER-SERVICE/actuator/health # 接口预验证 curl -X POST http://USER-SERVICE/user/register -H "Content-Type: application/json" -d '{}' ``` --- ### 相关问题 1. 如何实现Feign客户端的动态路径配置? 2. Consul服务注册失败会有哪些表现? 3. 微服务间如何保持接口版本兼容性?
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值