簡體   English   中英

從Ear應用程序中的Web模塊(RESTful服務)訪問ejb

[英]Access ejb from web module (RESTful services) in ear application

我有一個包含ejb.jar和一個Web應用程序(戰爭)的Ear應用程序。 ejb.jar包含我所有的EJB(bean和接口),而war包含REST Web服務。 我想從war模塊訪問EJB,這可能嗎? 注入EJB不起作用,我得到了空指針異常。

我知道這個問題已經被問了很多遍了,但是我似乎無法解決這個問題……

我正在使用Glassfish v2.1.1(我知道我應該升級,但是現在很難...)

這是返回nullPointerException的代碼片段:(我知道我不應該通過GET驗證用戶,但這只是一個示例代碼,我試圖檢查是否可以訪問ejb)

@Path("/user")
public class UserWS
{
    @EJB
    SB_usrRemote sb_usrRemote;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String checkLoginAttempt(String username, String password)
    {
        return sb_usrRemote.checkLoginAttempt(username, password).toString();
    }
}

我沒有提到該代碼僅在將ejb.jar包含在ear應用程序的lib文件夾中時才起作用,而war模塊可以在該文件夾中“看到”它。 還有什么其他方法可以訪問EJB類? 我也在使用Intellij,該應用程序是一個Java EE應用程序,其中包括一個Web模塊(用於戰爭)。

編輯

我無法避免玻璃魚從v2升級到v4。 我的所有問題都消失了,這是我做出的最好決定。 我代碼中的所有ejb注入都像一個魅力!

謝謝你們的建議! 我接受hugh的回答,因為JNDI可能會起作用,但是從長遠來看,升級glassfish似乎是一個更合適的解決方案。

編輯2

我終於設法使用以下代碼進行了正確的ejb注入:

@Path("/user")
public class UserWS
{
    @EJB (lookup = "java:global/<ear-name>/<ejb-jar-name>/SB_usrRemote")
    SB_usrRemote sb_usrRemote;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String checkLoginAttempt(String username, String password)
    {
        return sb_usrRemote.checkLoginAttempt(username, password).toString();
    }
}

部署耳朵文件時,我在glassfish日志中找到了正確的查找路徑。

根據JAX-RS規范,默認情況下,JAX-RS類中不啟用注入。 您或者需要使用CDI bean部署檔案(為CDI 1.0添加WEB-INF / beans.xml),使JAX-RS類成為托管bean(向類添加@ManagedBean批注),或者使JAX。 -RS類是EJB(例如,將@Stateless批注添加到該類)。

不會注入該bean,因為此類不是EJB。 您應該能夠使用JNDI查找獲得副本:

SB_usrRemote bean = (SB_usrRemote) new InitialContext().lookup("SB_usrRemote");

有關JNDI查找的更多信息,請參見: 鏈接

另一種可能性是使Bean成為托管Bean-我認為這在JSF中是可行的,但我恐怕對此一無所知。 [根據Bkail的回答,編輯-JAX-RS,而不是JSF]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM