菜鳥學EJB(二)——在同一個SessionBean中使用@Remote和@Local

劉水鏡發表於2014-04-25

不廢話,直接進入正題:


在Jboss4及以前的版本中,如下程式碼可以成功部署:

package com.tjb.ejb;

import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
@Remote
@Local
public class UserManagerBean implements UserManager {

    public void saveUser(User user) {
        System.out.println("User物件已被儲存");
    }

}

 


從程式碼可以看出,UserManagerBean對介面UserManager 同時宣告瞭遠端和本地兩種釋出方式,這種方式在Jboss4及以前的版本中是被允許的,但是Jboss5以後的版本則認為這是錯誤的(具體從哪個版本開始改的,這裡就不追究了)。如果將上面的程式碼部署到Jboss5中,會出現以下的錯誤提示:

java.lang.RuntimeException: @Remote and @Local may not both be specified on the same interface "interface 
com.lzq.ejb.UserManager" for EJB "UserManagerBean" per EJB3 Spec 4.6.6, Bullet 5.4 [EJBTHREE-751]
    at org.jboss.ejb3.proxy.factory.ProxyFactoryHelper.getLocalAndBusinessLocalInterfaces(ProxyFactoryHelper.java:233)
    at org.jboss.ejb3.proxy.factory.ProxyFactoryHelper.getLocalBusinessInterfaces(ProxyFactoryHelper.java:550)
    at org.jboss.ejb3.session.SessionContainer.resolveBusinessInterfaces(SessionContainer.java:192)
    at org.jboss.ejb3.EJBContainer.instantiated(EJBContainer.java:1564)
    at org.jboss.ejb3.session.SessionContainer.instantiated(SessionContainer.java:182)
    at org.jboss.ejb3.Ejb3Deployment.deployElement(Ejb3Deployment.java:726)
    ... 33 more

 


根據第一句話就能看出來,是因為不允許對同一個介面同時宣告Remote和Local兩種釋出方式,因此,在Jboss5中要實現這樣的功能,就需要實現兩個介面,程式碼如下:

package com.tgb.ejb;

import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
@Remote(value=UserManagerRemote.class)
@Local(value=UserManagerLocal.class)
public class UserManagerBean implements UserManagerLocal,UserManagerRemote {

    @Override
    public void saveUser(User user) {
        System.out.println("Use物件已被儲存");    

    }

}

 


如果兩個介面中的方法相同,重寫一個即可。


結論:在Jboss4及以前的版本,可以在一個SessionBean中對同一個介面同時宣告Remote和Local兩種釋出方式;而在Jboss5以後的版本中則不允許這種方式,如果要在一個SessionBean中同時使用Remote和Local方式,則必須實現兩個介面,並指明哪個介面用哪種方式。推薦使用第二種,因為任何版本的Jboss都支援此方式。


相關文章