Java GlassFish随机选择错误的JCA连接工厂进行注射

Java GlassFish随机选择错误的JCA连接工厂进行注射,java,glassfish,glassfish-4,jca,Java,Glassfish,Glassfish 4,Jca,我正在为FTP和SFTP编写JCA资源适配器。由于我的目标是能够使用完全独立于另一个协议的一个协议,因此我有两个不同的ManagedConnectionFactory类,每个协议一个。两者都有不同的连接定义注释;Glassfish domain.xml包含FTP适配器的资源定义,但不包含SFTP适配器的资源定义。现在,当我将FTPConnectionFactory注入EJB时,我有时会得到一个InjectionException,因为WELD尝试注入SFTPonnectionFactory,这在

我正在为FTP和SFTP编写JCA资源适配器。由于我的目标是能够使用完全独立于另一个协议的一个协议,因此我有两个不同的ManagedConnectionFactory类,每个协议一个。两者都有不同的连接定义注释;Glassfish domain.xml包含FTP适配器的资源定义,但不包含SFTP适配器的资源定义。现在,当我将FTPConnectionFactory注入EJB时,我有时会得到一个InjectionException,因为WELD尝试注入SFTPonnectionFactory,这在appserver运行期间当然是一致的;我要么总是得到正确的,要么是错误的。删除SFTP适配器的ConnectionDefinition注释似乎可以解决问题

因此,问题是:

如何修复此问题并使Glassfish注入正确的类?这是由我的代码中的问题引起的还是由Glassfish问题引起的? 根据规范,RA具有多个ConnectionDefinition注释以及实现ManagedConnectionFactory的类的多个实例是合法的;但是我找不到关于在同一个资源适配器中有多个不同类实现ManagedConnectionFactory的任何信息。玻璃鱼显然似乎有问题——这是明确允许的还是不允许的? 对于SFTP情况,FTP的连接定义被SFTP取代:

@ConnectionDefinition(connectionFactory = FTPConnectionFactory.class,
    connectionFactoryImpl = FTPConnectionFactoryImpl.class,
    connection = FTPConnection.class, connectionImpl = FTPConnectionImpl.class)
FTP和SFTP工厂和ManagedConnection类共享共同的祖先,但没有直接的联系——但这似乎并不重要,因为完全分离实现没有任何区别

domain.xml代码段:


TL;DR:这是由于连接池配置不正确造成的,其中连接定义名称未指向实现ConnectionFactory的类。观察到的行为是一个错误,并已报告

在尝试通过添加第二组类和另一个连接定义来重现Adam Biens文件系统资源适配器的此问题时,我发现只有在domain.xml中的连接器连接池定义不正确时才能重现此行为:如果我将连接定义名称改为指向不存在的类,Glassfish会随机选择两个定义的连接器中的一个。仔细检查我的连接池,我发现我在xml中错误地使用了Connection类而不是ConnectionFactory类。因此,当属性不指向实现ConnectionFactory接口的类时,Glassfish似乎会从实现ConnectionFactory的资源适配器中随机选择任何类,甚至不会打印错误消息

<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;