J'ai trois projets
demo-jca-api qui défini les interfaces
1 2
| com.sample.adapter.HelloWorldConnectionFactory
com.sample.adapter.HelloWorldConnection |
demo-jca qui implemente une resource JCA sur cette API
1 2 3 4 5
| package com.sample.adapter.impl;
import com.sample.adapter.HelloWorldConnectionFactory;
public class HelloWorldConnectionFactoryImpl implements HelloWorldConnectionFactory
{... |
enfin j'ai un war qui utilise cette ressource
1 2 3 4
| @Resource(name="java:/eis/HelloWorld")
HelloWorldConnectionFactory helloFactory;
HelloWorldConnection hello = helloFactory.getConnection();
return hello.helloWorld(); |
La ressource se déploie correctement sous Wildfly (debug pas à pas avec éclipse tout est ok)
le war démarre correctement.
lorsque j'appelle la méthode avec la code ci-dessus
j'ai l'exception suivante
Caused by: java.lang.ClassCastException: Cannot cast com.sample.adapter.impl.HelloWorldConnectionFactoryImpl to com.sample.adapter.HelloWorldConnectionFactory
J'ai changé mon code pour le faire à l’ancienne et voir ce qu'il se passait exactement.
1 2 3 4 5 6 7 8 9
| Context context = new InitialContext();
Object object = context.lookup("java:/eis/HelloWorld");
Class<?> interf = object.getClass().getInterfaces()[0];
if (HelloWorldConnectionFactory.class.isAssignableFrom(object.getClass())) {
System.err.println("test");
}
HelloWorldConnectionFactory helloFactory = HelloWorldConnectionFactory.class.cast(object);
HelloWorldConnection hello = helloFactory.getConnection();
return hello.helloWorld(); |
en mode débug cela m'a permis de voir que HelloWorldConnectionFactory.class et interf sont toutes les deux com.sample.adapter.HelloWorldConnectionFactory, mais n'ont pas le même id
et ne référence pas le même classloader.
Cela parait logique puisque interf est chargé par le module rar alors que HelloWorldConnectionFactory est chargé par le war.
mais du coup je ne trouve pas comment faire.
tout cela n'est pas dans un EAR. mon besoin est de partager le RAR entre plusieurs applications.
A+JYT
Partager