FTP および SFTP 用の JCA リソース アダプタを作成中です。私の目標は、1 つのプロトコルを他のプロトコルから完全に独立して使用できるようにすることなので、プロトコルごとに 1 つずつ、2 つの異なる ManagedConnectionFactory クラスがあります。どちらも異なる ConnectionDefinition アノテーションを持っています。Glassfish の domain.xml には、FTP アダプタのリソース定義が含まれていますが、SFTP アダプタのリソース定義は含まれていません。現在、FTPConnectionFactory
EJB に を注入すると、代わりに WELD が を注入しようとするため、InjectionException が発生することがありSFTPConnectionFactory
ます (これはもちろん、アプリケーション サーバーの実行中に一貫しています。一貫して正しいものまたは間違ったものを取得します)。SFTP アダプターの ConnectionDefinition アノテーションを削除すると、問題が解決するようです。
だから、質問:
- これを修正して、Glassfish に正しいクラスを注入させるにはどうすればよいですか? これは私のコードの問題が原因でしょうか?それとも Glassfish の問題ですか?
- 仕様によると、RA が複数の ConnectionDefinition アノテーションと、ManagedConnectionFactory を実装するクラスの複数のインスタンスを持つことは合法です。しかし、同じリソース アダプタ内に複数の異なるクラスが 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;