我正在为 FTP 和 SFTP 编写 JCA 资源适配器。由于我的目标是能够使用一种完全独立于另一种协议的协议,因此我有两个不同的 ManagedConnectionFactory 类,每个协议一个。两者都有不同的 ConnectionDefinition 注释;Glassfish domain.xml 包含 FTP 适配器的资源定义,但不包含 SFTP 适配器的资源定义。现在,当我将 注入FTPConnectionFactory
EJB 时,有时会收到 InjectionException,因为 WELD 会尝试注入SFTPConnectionFactory
(这在应用服务器运行期间当然是一致的;我始终得到正确的或错误的)。删除 SFTP 适配器的 ConnectionDefinition 注释似乎可以解决问题。
所以,问题:
- 我该如何解决这个问题并让 Glassfish 注入正确的类?这可能是由我的代码中的问题引起的,还是 Glassfish 问题?
- 根据规范,RA 具有多个 ConnectionDefinition 注释以及实现 ManagedConnectionFactory 的类的多个实例是合法的;但我找不到任何有关在同一个资源适配器内实现多个不同类的信息。Glassfish 显然似乎有问题 - 这是在某处明确允许还是不允许?
ConnectionDefinition(在 SFTP 案例中 FTP 被 SFTP 取代):
@ConnectionDefinition(connectionFactory = FTPConnectionFactory.class,
connectionFactoryImpl = FTPConnectionFactoryImpl.class,
connection = FTPConnection.class, connectionImpl = FTPConnectionImpl.class)
FTP 和 SFTP Factory 和 ManagedConnection 类共享共同的祖先,但不直接相关 - 但这似乎并不重要,因为完全分离实现没有区别。
domain.xml
片段:
<resource-adapter-config resource-adapter-name="ftpconnector" thread-pool-ids="thread-pool-1" />
<connector-connection-pool name="jca/ftpConnectorPool"
resource-adapter-name="ftpconnector"
connection-definition-name="foo.bar.ftp.FTPConnection"
transaction-support="NoTransaction" match-connections="false" />
<connector-resource pool-name="jca/ftpConnectorPool" jndi-name="jca/ftpConnector" />
和注入的领域:
@Resource(lookup = "jca/ftpConnector")
private FTPConnectionFactory ftpConnectionFactory;