Я нахожусь в процессе написания адаптера ресурсов JCA для FTP и SFTP. Поскольку моя цель — иметь возможность использовать один протокол, полностью независимый от другого, у меня есть два разных класса ManagedConnectionFactory, по одному для каждого протокола. Оба имеют разные аннотации ConnectionDefinition; Домен Glassfish.xml содержит определение ресурса для адаптера FTP, но не для адаптера SFTP. Теперь, когда я внедряю FTPConnectionFactory
в EJB, я иногда получаю InjectionException, так как WELD вместо этого пытается внедрить SFTPConnectionFactory
(конечно, это согласуется во время работы сервера приложений; я постоянно получаю правильный или неправильный результат). Удаление аннотации ConnectionDefinition для адаптера SFTP, похоже, решает проблему.
Итак, Вопросы:
- Как я могу исправить это и заставить Glassfish ввести правильный класс? Может ли это быть вызвано проблемой в моем коде или это проблема Glassfish?
- Согласно спецификации, RA может иметь несколько аннотаций ConnectionDefinition, а также несколько экземпляров класса, реализующего ManagedConnectionFactory; но я не смог найти никакой информации о наличии нескольких разных классов, реализующих ManagedConnectionFactory внутри одного и того же адаптера ресурсов. У Glassfish явно есть проблемы с этим - это где-то явно разрешено или запрещено?
ConnectionDefinition (с заменой FTP на SFTP для случая 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;