2

我正在实现一个自定义身份验证提供程序,它必须对用户进行身份验证和授权(通过一次性令牌/密码)。为此目的已经有一个服务器,并且我们已经提供了一个客户端 API 以在我们的应用程序中用于调用此身份验证/授权服务器。

出于商业原因,我们被允许在我们的测试环境中复制该身份验证服务器的测试设置,因此当我们部署到我们的环境时,我们必须以某种方式模拟这个客户端 API,而当我们交付给客户时使用实际的 impl。我被困在创建一种干净的方式来将此客户端 API 作为 bean 注入我的 Spring 应用程序

他们提供的客户端 API 本质上是一个带有公共类(无接口)和一些公共静态方法的单个包 JAR,我没有可以用来注入此客户端 API 或虚拟实现的接口。

这就是我打算做的

创建接口

public interface ClientAPIWrapper {

}

然后注入它的差异实现

IE

public class DummyClientApiBean implements ClientAPIWrapper

public class ClientApiBean extends ClientAPI implements ClientAPIWrapper

但后来我意识到注入这种接口的类型将不允许访问原始客户端 API 类的方法

@Autowired
private ClientAPIWrapper clientApiBean

我想要实现的是使用原始客户端 API 类作为 bean 或虚拟 bean 将虚拟数据透明地返回给使用任一实现的类。

就像是

public MyAuthenticationProvider

@Autowired
private ClientAPI clientApi

如何做到这一点?

4

1 回答 1

4

这里的问题是 API 只包含静态方法(如果我正确理解了您的问题)。最干净的解决方案(但仍然丑陋)是为 API 编写一个接口和一个具有非静态方法的外观类,该方法委托给真正的 API。对于模拟,创建接口的第二个实现。

于 2014-02-19T16:23:39.557 回答