【问题标题】:using multiple implementations for a 3rd party library in spring: stuck finding a clean approach在春季为第 3 方库使用多种实现:卡在寻找干净的方法
【发布时间】:2014-02-19 15:37:47
【问题描述】:

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

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

类似

public MyAuthenticationProvider

@Autowired
private ClientAPI clientApi

如何做到这一点?

【问题讨论】:

  • 您使用的是什么版本的 Spring?还有,Spring Java Config 还是 XML?
  • Spring 3.2.4.RELEASE,XML 配置

标签: java spring spring-aop spring-ioc


【解决方案1】:

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

【讨论】:

  • 我最终选择为原始API创建子类,一旦调用实际的超类方法,其他覆盖方法以发送虚拟响应,现在使用@Qualifier注解注入它们。
猜你喜欢
  • 1970-01-01
  • 2013-03-18
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2021-04-14
  • 2019-03-15
相关资源
最近更新 更多