Problème de classloader wilfly
J'ai trois projets
demo-jca-api qui défini les interfaces
Code:
1 2
| com.sample.adapter.HelloWorldConnectionFactory
com.sample.adapter.HelloWorldConnection |
demo-jca qui implemente une resource JCA sur cette API
Code:
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
Code:
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
Code:
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.
Code:
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