Dans mon scénario, j'essaie d'utiliser des adaptateurs JCA pour me connecter à un stockage externe - juste pour essayer cette fonctionnalité de J2EE. J'utilise JBoss EAP 7 et son implémentation condensée ironjacamar.JCA Connector Classloading
i déployer un adapter.rar
, qui contient un adapter.jar
(ce qui comprend les Connection
et ConnectionFactory
Interfaces et toutes les implémentations) et META-INF/ironjacamar.xml
.
Je Déployez ensuite un fichier app.war
, contenant un Bean avec un champ annoté:
@RequestScoped
public class Bean {
...
@Resource(lookup = "java:/eis/StorageConnectionFactory")
private StorageConnectionFactory connectionFactory;
}
La guerre contient également la adapter.jar comme bibliothèque - comme il a besoin de connaître de toutes les classes à l'exécution (noClassDefFound etc.)
à mon grand étonnement, le connecteur lui-même semble fonctionner - comme l'exception est d'obtenir:
java.lang.IllegalArgumentException: Impossible de définir le champ conn.StorageConnectionFactoryImpl Bean.connectionFactory à conn.H smConnectionFactoryImp
et sur les interfaces même omettant:
@Resource(lookup = "java:/eis/StorageConnectionFactory")
private StorageConnectionFactoryImpl connectionFactory;
encore
java.lang.IllegalArgumentException: Can not set conn.StorageConnectionFactoryImpl field Bean.connectionFactory to conn.HsmConnectionFactoryImp
Je vois que le problème est que le adaptateur.rar ne partage Nto le même classloader que le app.war et les deux contiennent les classes correspondantes, conduisant à une sorte de ClassCastException - comment puis-je résoudre ce problème correctement?