2013-11-15 34 views
0

我正在使用Glassfish 4.並且我有一個具有WAR和JAR(帶有EJB)的EAR。從同一個EAR中的WAR中調用EJB

我想從我的抗戰調用EJB的,但我真的不知道,如果我需要使用本地或遠程接口。

在我的JAR,我的豆看起來是這樣的:

@Stateless 
public class Test implements TestLocal { 

    @Override 
    public void testing() { 
    } 
} 

我的地方:

@Local 
public interface TestLocal { 
    void testing(); 
} 

裏面我的抗戰我有一個Web服務,它看起來像這樣:

@WebService(serviceName = "TestWS") 
public class TestWS { 

    private @EJB TestLocal testBean; 

    @WebMethod(operationName = "test") 
    public String test() { 
    testBean.test(); 
    } 
} 

這兩個被打包成一個EAR

當我打電話給我的WebService方法,我得到一個AccessLocalException

Warnung: javax.ejb.AccessLocalException: Client not authorized for this invocation at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1895) at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:210)

首先:

  • 這是正確的方式來調用EJB。 EAR中的WAR可以使用包含的JAR中的本地接口嗎?
  • 如果是這樣,那麼有人知道我在做什麼錯了嗎?我是否需要設置某種安全配置?
+0

您是否有任何針對您的EJB的安全配置設置? – JamesB

回答

0

要查找遠程EJB,就必須有暴露的遠程接口。將這個遠程接口包含在你的戰爭中。

Glassfish的文檔具有用於這個錯誤的條目:

javax.ejb.AccessLocalException: Client Not Authorized Error 

說明

角色的映射信息是在特定於Sun的XML可用(例如,太陽ejb-jar.xml中),和認證是好的,但顯示以下錯誤消息:

[...INFO|sun-appserver-pe8.0|javax.enterprise.system.container.ejb|...| 
javax.ejb.AccessLocalException: Client not authorized for this invocation. 
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:... 
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(...) 

檢查EJB模塊(.jar)或Web模塊(.war)是否打包在應用程序(.ear)中,並且在應用程序級別(特定於Sun的sun-application.xml)中沒有角色映射信息。對於任何應用程序(.ear),必須在sun-application.xml中指定安全角色映射信息。具有模塊級XML和應用程序級XML是可以接受的。如果您單獨部署的jar包含在不同的服務器上的EJB組件,例如

0

@Remote是有用的。

在那裏,戰爭和罐子在同一個耳朵,所以你只需要使用本地註釋。

溫馨提示:由於不需要EJB 3.1接口,您可以在「測試」類直接使用@LocalBean並刪除TestLocal接口。

要將ejb方法調用爲您的戰爭類,您首先必須創建war和jar之間的鏈接。同一個耳朵是不夠的。 如果您使用Maven,您可以簡單地將jar引用添加到您的戰爭中的依賴項中。

+0

我不認爲這是完全正確的。如果EJB jar是EAR的一個模塊,那麼它的所有類都可用於WAR。添加對POM的引用(' compile')將把EJB jar添加到'WAR/WEB-INF/lib'文件夾,如果EJB jar已經是EAR的一個模塊,則不需要。 – rubenlop

相關問題