在现有FeignClient接口中使用自定义客户端,具有相同的目标URL

时间:2018-04-06 05:47:52

标签: java spring-boot spring-cloud spring-cloud-feign feign

我有一个用@FeignClient注释的现有界面:

@FeignClient(name = "myRemoteService", url = "${myRemoteService.url}/api/v3/", decode404 = true, configuration = MyRemoteServiceConfig.class)
public interface FeignRemoteService extends RemoteService

它有一堆工作正常的方法。

现在,我需要添加一个不适合简单@FeignClient的方法。而且我不希望我的其余代码知道这一点,并且只为该用例使用FeignRemoteService之外的其他类,所以我想让它适合现有的FeignRemoteService以便它可以使用它对于使用它的类是透明的。

用例是每次调用方法时我都需要传递不同的凭据。为此,我创建了一个默认界面,我将自定义代码放在其中:

@Override
default UpdatedResource updateContent(String repoFullName, String path, MyStuff myStuff, String login, String password) {

    ContentClient contentClient = Feign.builder()
            .logger(new Slf4jLogger(ContentClient.class))
            .encoder(new JacksonEncoder())
            .decoder(new JacksonDecoder())
            .requestInterceptor(new BasicAuthRequestInterceptor(login, password))
            .logLevel(Logger.Level.FULL)
            .target(ContentClient.class, GlobalProperties.getRemoteServiceUrl() + "/api/v3/" + repoFullName + "/contents/" + path);

    return contentClient.updateContent(myStuff);

}

以及客户端的界面:

interface ContentClient {
  @RequestLine("PUT")
  @Headers("Content-Type: application/json")
  UpdatedResource updateContent(MyStuff myStuff);
}

它有效,但我对解决方案不满意,因为它非常丑陋...我还没有找到一种很好的方法来注入 myRemoteService.url 我构建的自定义Feign客户端,比我的代码更接近,而不是GlobalProperties类中的静态变量。

有没有更好的方法可以这样做,以便 myRemoteService.url 可以注入两次:

  • in @FeignClient - 此处没有问题。
  • 在自定义Feign客户端中,在默认方法中构建。

如果有一个完全不同的方法,只要所有东西都在同一个服务中,那么我也是开放的,因此差异对消费者来说是隐藏的。

0 个答案:

没有答案