我有一个用@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
- 此处没有问题。如果有一个完全不同的方法,只要所有东西都在同一个服务中,那么我也是开放的,因此差异对消费者来说是隐藏的。