我正在为FTP和SFTP编写JCA资源适配器。由于我的目标是能够使用一个完全独立于另一个协议的协议,我有两个不同的ManagedConnectionFactory类,每个协议一个。两者都有不同的ConnectionDefinition注释; Glassfish domain.xml包含FTP适配器的资源定义,但不包含SFTP适配器的资源定义。现在,当我将FTPConnectionFactory
注入EJB时,我有时会得到一个InjectionException,因为WELD会尝试注入SFTPConnectionFactory
(这在appserver运行期间当然是一致的;我要么始终得到是对还是错的)。删除SFTP适配器的ConnectionDefinition批注似乎可以解决问题。
所以,问题:
ConnectionDefinition(SFTP替换为SFTP的FTP):
@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;
答案 0 :(得分:0)
TL; DR:这是由配置不正确的连接池引起的,其中connection-definition-name
未指向实现ConnectionFactory
的类。观察到的行为是IMO的一个错误,并且已经报告here。
在尝试使用Adam Biens connectorz文件系统资源适配器(通过添加第二组类和另一个连接定义)重现此问题时,我发现如果connector-connection-pool
in {},我只能重现该行为domain.xml的定义不正确:如果我将connection-definition-name
更改为指向不存在的类,Glassfish将随机选择两个定义的连接器之一。双重检查我的连接池,我发现我错误地使用了Connection类而不是xml中的ConnectionFactory类。因此,当该属性未指向实现ConnectionFactory
接口的类时,Glassfish似乎会从资源适配器中随机选择实现ConnectionFactory
的任何类,甚至不会打印错误消息。