我正在实现一个自定义身份验证提供程序,它必须对用户进行身份验证和授权(通过一次性 token /密码)。为此目的已经有一个服务器,并且我们已经提供了一个客户端 API,可以在我们的应用程序中使用来调用此身份验证/授权服务器。
出于商业原因,我们可以在测试环境中复制该身份验证服务器的测试设置,因此,当我们部署到我们的环境时,我们必须以某种方式模拟此客户端 API,而当我们交付给客户时,我们必须使用实际的 impl。我一直在创建一种干净的方法来将此客户端 API 作为 bean 注入(inject)到我的 spring 应用程序中
他们提供的客户端 API 本质上是一个带有公共(public)类(无接口(interface))和一些要使用的公共(public)静态方法的单包 JAR,没有可以用来注入(inject)此客户端 API 或虚拟实现的接口(interface)。
这就是我打算做的
创建界面
public interface ClientAPIWrapper {
}
然后注入(inject)它的 diff 实现
即
public class DummyClientApiBean implements ClientAPIWrapper
和
public class ClientApiBean extends ClientAPI implements ClientAPIWrapper
但后来我意识到作为该接口(interface)的类型注入(inject)将不允许访问原始客户端 API 类的方法
@Autowired
private ClientAPIWrapper clientApiBean
我想要实现的是使用原始客户端 API 类作为 bean 或虚拟 bean,将虚拟数据透明地返回到使用任一实现的类。
类似的东西
public MyAuthenticationProvider
@Autowired
private ClientAPI clientApi
如何实现这一点?
最佳答案
这里的问题是 API 仅包含静态方法(如果我正确理解了你的问题)。最干净的解决方案(但仍然丑陋)是为 API 编写一个接口(interface),并编写一个具有委托(delegate)给真正 API 的非静态方法的外观类。为了进行模拟,创建该接口(interface)的第二个实现。
关于java - 在 spring 中使用第三方库的多个实现 : stuck finding a clean approach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21885247/