2011-04-01 41 views
2

我有一個包含這個bean如何解決JBOSS 6.0上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); 
    } 

} 

第二耳文件有這個bean

@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); 
    } 
} 

這是例外,我得到一個ear文件:

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) 

我該如何解決這個?

我知道兩個ear文件都配置了不同的類加載器,但我不知道如何配置兩個類都具有相同的類加載器。

這是什麼rougly我在我的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> 

and

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

但沒有任何工作。我找不到任何有用的文檔。

回答

1

使用加載程序存儲庫標記,您告訴JBoss將每個耳朵放入單獨的類加載器中。

如果您通常需要隔離,可以將違規類放入jar文件中,例如在服務器// lib中,以便它位於兩個耳朵都可以訪問(通過委派)的基類加載器中。

或者你可以設置耳朵部署者沒有類加載器隔離並刪除那些加載器庫,以便類在UCL中結束。

+0

1.)我以這種方式認爲我定義所有具有相同域「packagename」的耳朵使用相同的類加載器? 2)把它放在通用庫文件中是不可能的問題 3)沒有隔離也是不可能的,還有其他耳朵依賴於它。 – Mauli 2011-04-02 19:59:51