Как решить проблему загрузки классов между файлами ear на JBOSS 6.0? - PullRequest
2 голосов
/ 01 апреля 2011

У меня есть файл ear, содержащий этот компонент

@Stateless
public class ProjectServiceImpl implements ProjectServiceLocal, ProjectServiceRemote {

    @Override
    public List<Project> listProjects() {
        Project project = new Project();
        project.setId(0l);
        project.setName("Foo");
        return Arrays.asList(project);
    }

}

файл второго уха имеет этот компонент

@Stateless
public class EntryServiceImpl implements EntryServiceLocal, EntryServiceRemote {

    @EJB(lookup="packagename/ProjectServiceImpl/local")
    private ProjectServiceLocal projectService;

    @Override
    public List<Entry> listEntries() {
        Project project = projectService.listProjects().get(0); // here happens the class cast exception
        Entry entry = new Entry();
        entry.setId(0l);
        entry.setProject(project);
        entry.setFrom(new Date());
        entry.setTo(new Date());
        return Arrays.asList(entry);
    }
}

Это исключение, которое я получаю:

Exception in thread "main" javax.ejb.EJBException: java.lang.ClassCastException: packagename.dto.Project cannot be cast to packagename.dto.Project
    at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:183)
    at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:251)
    at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.required(CMTTxInterceptor.java:349)

Как я могу решить эту проблему?

Я понимаю, что в обоих ушных файлах настроены разные загрузчики классов, но я не знаю, как настроить оба одинаковых загрузчика классов.

это грубо, что у меня есть в моем jboss-app.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE jboss-app
    PUBLIC "-//JBoss//DTD J2EE Application 4.2//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-app_4_2.dtd\">

<jboss-app>
    <loader-repository>
        packagename:archive=ear1.ear
    </loader-repository>
</jboss-app>

и

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE jboss-app
    PUBLIC "-//JBoss//DTD J2EE Application 4.2//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-app_4_2.dtd\">

<jboss-app>
    <loader-repository>
        packagename:archive=ear2.ear
    </loader-repository>
</jboss-app>

Я также создал файлы jboss-classloading.xml для каждого уха:

<?xml version="1.0" encoding="UTF-8"?>
    <classloading xmlns="urn:jboss:classloading:1.0" name="ear1.ear" domain="packagename">
</classloading>

и

<?xml version="1.0" encoding="UTF-8"?>
    <classloading xmlns="urn:jboss:classloading:1.0" name="ear2.ear" domain="packagename">
</classloading>

Но ничего не работает. И я не могу найти никакой полезной документации.

1 Ответ

1 голос
/ 02 апреля 2011

С помощью тегов репозитория загрузчика вы указываете JBoss поместить каждый из ушей в отдельный загрузчик классов.

Если вам обычно требуется изоляция, вы можете поместить класс-нарушитель в файл jar, например на сервере //lib, чтобы оба базовых загрузчика имели доступ к (через делегирование) обоим ушам.

Или вы можете настроить средство развертывания ear на отсутствие изоляции загрузчика классов и удалить эти хранилища загрузчиков, чтобы классы заканчивалисьв UCL.

...