不廢話,直接進入正題:
在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都支援此方式。