如何在OpenFeign的@RequestLine注解中禁用PCT编码避免双重编码?
Feign 避免路径参数双重编码的解决方案
你的场景中,路径参数已经是PCT编码后的字符串,但Feign默认会对@Param注解的参数再次编码,引发双重编码问题。要实现参数原样传递到HTTP请求行,有以下几种可行方案:
方案一:使用Feign原生
@Encoded注解
在参数上添加@Encoded注解,明确告知Feign该参数已完成编码,无需再次处理。修改后的接口代码如下:@RequestLine("GET {path}") String getMeStuff(@Param("path") @Encoded String path);这是最直接的解决方案,无需额外自定义类。
方案二:自定义参数扩展器
Param.Expander
若需要针对特定参数做个性化处理,可实现Param.Expander接口直接返回原字符串:- 实现扩展器类:
public class RawPathExpander implements Param.Expander { @Override public String expand(Object value) { return value.toString(); } } - 在参数上指定该扩展器:
@RequestLine("GET {path}") String getMeStuff(@Param(value = "path", expander = RawPathExpander.class) String path);
- 实现扩展器类:
方案三:全局配置禁用路径参数编码
若希望所有Feign客户端的路径参数都跳过自动编码,可通过自定义Feign配置实现。以Spring Cloud环境为例:@Configuration public class FeignRawConfig { @Bean public Contract feignContract() { return new Contract.Default() { @Override protected void processAnnotationOnParameter(MethodMetadata data, Annotation annotation, int paramIndex) { if (annotation instanceof Param) { data.indexToExpanderClass().put(paramIndex, RawPathExpander.class); } else { super.processAnnotationOnParameter(data, annotation, paramIndex); } } }; } }之后在Feign客户端注解中指定该配置类即可全局生效。
内容的提问来源于stack exchange,提问作者Yaroslav Buhaiev
相关产品推荐
相关产品推荐

