@FeignClient path属性路径前缀带路径变量时报错的解决

  • Post category:http

针对@FeignClient path属性路径前缀带路径变量时报错的解决,我给出以下完整攻略。

背景

在使用@FeignClient时,有时候需要在path属性中添加路径前缀,并且这个路径前缀中还需要包含路径变量,例如”/api/{version}/user”。然而,这样的配置可能导致Feign调用报错,无法正确解析路径变量。

解决方案

修复这种报错的方式是在@FeignClient注解的path属性中使用占位符”{}”时,需要在占位符外层加一层括号,例如”/api/{version}/user”应该改为”/api/({version})/user”。

下面提供两条示例说明。

示例一

@FeignClient(name = "user-api", url = "${user.api.url}", path = "/api/({version})")
public interface UserApiFeignClient {

    @GetMapping(value = "/user/{id}")
    UserDTO getUserById(@PathVariable("id") Integer id, @PathVariable("version") String version);

}

在上述示例中,我们提供了一个名为UserApiFeignClient的Feign客户端,在path属性中包含路径前缀”/api/{version}”,其中{version}是一个路径变量。为了避免Feign调用报错,我们需要将路径前缀中的”{version}”改为”({version})”。

示例二

@FeignClient(name = "payment-api", url = "${payment.api.url}")
public interface PaymentApiFeignClient {

    @GetMapping(value = "/payment/{id}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    PaymentDTO getPaymentById(@RequestParam("id") Long id, @RequestParam("version") String version);

}

在上述示例中,我们提供了一个名为PaymentApiFeignClient的Feign客户端,在path属性中不包含路径前缀。但是我们在调用getPaymentById方法时会传递两个参数id和version,它们分别对应/payment/{id}和?version={version}中的路径变量和查询参数。其中,路径变量需要遵循上述提到的规则,在路径前缀中加一层括号。

总结

以上便是完整攻略,针对Feign中@FeignClient path属性路径前缀带路径变量时报错的解决方案,我们需要在path属性中的路径前缀中加一层括号,将占位符”{}”改为”({})”,这样才能避免Feign调用报错。