0

我有一个带有注释的现有界面@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可以注入两次:

  • @FeignClient- 这里没有问题。
  • 在自定义 Feign 客户端中,内置在默认方法中。

如果有完全不同的方法,我也持开放态度,只要一切都在同一个服务中,这样消费者就会隐藏差异。

4

0 回答 0