[OpenFeign] SpringBoot RequestMapping 默認decodeSlash

場景

在某個項目中,某個OpenFeign的 RequestMapping地址是 /api/v3/projects/{projectId}/repository/branches
,其中 projectId 可能含有斜槓,例如 a/b 編碼成 a%2Fb,而我們希望傳後者,但是OpenFeign會將這個%2F進行decode。

因此,要解決的問題:如何手動關閉OpenFeign解碼反斜槓

期望結果

例如 projectId=a/b
請求發送的時候應該是
/api/v3/projects/a%2Fb/repository/branches
而不是
/api/v3/projects/a/b/repository/branches

分析

在SpringBoot的環境中,Spring通過SpringMvcContract來處理Spring的註解到OpenFeign的對接。

SpringMvcContract 在 OpenFeign的 自動裝配類 FeignClientsConfiguration內聲明。

	@Bean
	@ConditionalOnMissingBean
	public Contract feignContract(ConversionService feignConversionService) {
		boolean decodeSlash = feignClientProperties == null || feignClientProperties.isDecodeSlash();
		return new SpringMvcContract(this.parameterProcessors, feignConversionService, decodeSlash);
	}

可以看到FeignClientProperties的decodeSlash默認是true。除非配置了 feign.client.decodeSlash=false

解決

全局解決

feign.client.decodeSlash=false

最小影響範圍

可以使用FeignClient的單獨配置覆蓋全局配置

參考鏈接 spring-cloud-feign-overriding-defaults

@slankka

@FeignClient(name = "yourClient", url= "slankka.com", configuration = YourClient.ClientConf.class)
public interface YourClient {
  class ClientConf{
     @Bean
          Contract contract(@Autowired(required = false) List<AnnotatedParameterProcessor> parameterProcessors,
                            ConversionService feignConversionService) {
              if (parameterProcessors == null) {
                  parameterProcessors = new ArrayList<>();
              }
              return new SpringMvcContract(parameterProcessors, feignConversionService, false);
          }
   }
}

參考 Issue

大神請直接移步:https://github.com/OpenFeign/feign/issues/1190

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章