java - 在 spring 中使用第三方库的多个实现 : stuck finding a clean approach

标签 java spring spring-aop spring-ioc

我正在实现一个自定义身份验证提供程序,它必须对用户进行身份验证和授权(通过一次性 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/

相关文章:

spring - JavaEE 有控制反转吗?

java - Spring AOP 不起作用

java - 从 mySql 数据库调用时,JSON 返回 NullPointerException

java - 如何在 JFrame 中以正确的方式实现计时器

java - 使用 spring-boot-2.2.1 删除 HATEOAS 链接中的 _embedded

java - Spring容器引入aspect后不注入(inject)依赖

Java EE servlet 作为 spring bean 代理

java - 尝试在表刷新后保留排序器位置

java - 由于多线程,ArrayIndexOutOfBounds,我该怎么办?

spring - 具有多个域的 Web 应用程序指向父域的子文件夹