我正在做一个项目,要求我执行带有会话令牌的标准HTTP调用。
我正在构建带有自定义身份验证器的自定义HTTP客户端,如下所示:
Client client = Client.Builder().withConfig().withAuthenticator(Authenticator);
而我的身份验证器是一个接口
public interface Authenticator{
SessionToken getSessionToken(); // so that different authentication methods can be supported
}
现在,为了执行请求,我需要获取一个会话令牌,该令牌是通过调用
authenticator.getSessionToken()
获得的。但是,身份验证器必须调用后端以获取令牌,而令牌为此需要客户端,从而导致循环依赖。我该如何解决?一种方法是创建一个单独的身份验证客户端,我将其传递给Authenticator Implementation的构造函数,但程序包导入仍会显示循环依赖性。有没有更好的方法来设计这个? 最佳答案
最终,Client
实际上并不需要Authenticator
。它需要一个SessionToken
。一种实现方法是用withAuthenticator()
替换withSessionToken()
方法。显而易见的实现是该方法直接接受SessionToken
;但您可能还认为Authenticator
是functional interface,因此可以表示为Supplier<SessionToken>
。
无论哪种方式,如果用Client
或Authenticator
替换SessionToken
上的Supplier<SessionToken>
依赖关系,都可以打破循环依赖关系。