在春天使用多个实现第三方库:找不到干净的方法

时间:2014-02-19 15:37:47

标签: java spring spring-aop spring-ioc

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

由于商业原因,我们可以在我们的测试环境中复制该认证服务器的测试设置,因此我们必须在部署到我们的环境时以某种方式模拟此客户端API,而在我们交付给客户时使用实际的impl。我很难创建一种将此客户端API作为bean注入我的spring应用程序的简洁方法

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

这是我打算做的事情

创建一个界面

public interface ClientAPIWrapper {

}

然后注入它的diff实现

即。

public class DummyClientApiBean implements ClientAPIWrapper

public class ClientApiBean extends ClientAPI implements ClientAPIWrapper

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

@Autowired
private ClientAPIWrapper clientApiBean

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

类似

public MyAuthenticationProvider

@Autowired
private ClientAPI clientApi

如何实现这个目标?

1 个答案:

答案 0 :(得分:4)

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