我想你想從Sun應用服務器的Web應用程序訪問EJB應用程序(稱爲EJB模塊),對嗎?
好的,我們走吧。
將EJB部署到應用程序服務器時,應用程序服務器爲其提供一個地址(稱爲全局JNDI地址),作爲您訪問它的一種方式(如您的地址)。它從應用程序服務器更改爲另一個。
在JBoss應用服務器,你可以看到全局JNDI地址在下面的地址
http://127.0.0.1:8080/jmx-console/HtmlAdaptor
在陽光應用服務器(啓動起來之後),如果你想看到全局JNDI地址(啓動起來後, ),請執行下列操作
訪問管理控制檯中的下列地址
http://127.0.0.1:4848/asadmin
並點擊JNDI瀏覽
如果EJB沒有被註冊在那裏,有什麼不對的
EJB有兩種形式:EJB 2.1和EJB 3.0。那麼區別是什麼呢 ?
好,好,好......
讓我們開始與EJB 2.1
- 創建一個Home接口
它定義了用於創建,銷燬,並尋找本地或遠程方法EJB對象。它充當EJB對象的生命週期接口。所有home接口必須擴展標準接口javax.ejb.EJBHome - 如果使用遠程ejb對象 - 或javax.ejb.EJBLocalHome - 如果使用本地EJB對象。
// a remote EJB object - extends javax.ejb.EJBHome
// a local EJB object - extends javax.ejb.EJBLocalHome
public interface MyBeanRemoteHome extends javax.ejb.EJBHome {
MyBeanRemote create() throws javax.ejb.CreateException, java.rmi.RemoteException;
}
應用服務器將創建Home對象作爲一種獲取EJB對象的方式,而不是其他任何東西。
照顧以下
會話bean的遠程home接口必須定義一個或多個創建<方法>方法。 無狀態會話bean必須定義一個<方法>沒有參數的方法。
...
throws子句必須包括javax.ejb.CreateException
...
如果你的主接口擴展javax.ejb.EJBHome,拋出子句必須包含java.rmi.RemoteException。如果它擴展了javax.ejb.EJBLocalHome,則不得包含java.rmi.RemoteException。
...
每個創建一個狀態會話bean的方法必須被命名爲創建<METHOD>,它 必須匹配的Init方法的一個或的ejbCreate < METHOD在會話 豆類中定義>方法。匹配ejbCreate <方法>方法必須具有相同的自變量和類型的自變量。無狀態會話bean的創建方法必須命名爲create,但不需要有匹配的「ejbCreate」方法。
現在創建一個業務接口,以便在我們的EJB對象定義業務邏輯
// a remote EJB object - extends javax.ejb.EJBObject
// a local EJB object - extends javax.ejb.EJBLocalObject
public interface MyBeanRemote extends javax.ejb.EJBObject {
void doSomething() throws java.rmi.RemoteException;
}
如果您使用的是遠程EJB現在照顧以下
對象,遠程接口方法不能顯示本地接口類型或本地home接口類型。
...
如果你的主接口擴展javax.ejb.EJBObject,拋出子句必須包括java.rmi.RemoteException異常。如果它擴展了javax.ejb.EJBLocalObject,則不能包含java.rmi.RemoteException。現在
我們的EJB
public class MyBean implements javax.ejb.SessionBean {
// why create method ? Take a special look at EJB Home details (above)
public void create() {
System.out.println("create");
}
public void doSomething() throws java.rmi.RemoteException {
// some code
};
}
現在採取以下
它必須實現javax.ejb.SessionBean護理。它定義了四個方法 - 上面沒有顯示:setSessionContext,ejbRemove,ejbPassivate和ejbActivate。
對於接口中定義的每個方法,必須在會話bean類匹配的方法:因爲EJB的規範說
通知我們的豆沒有實現我們的業務接口。匹配方法必須具有:
- 同名
- 相同數量和類型的參數,和相同的返回類型。
- 必須在本地接口的方法的throws子句中定義bean類的會話 的匹配方法的throws子句中定義的所有異常。
而你必須聲明一個ejb-jar。根據
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd" version="2.1">
<enterprise-beans>
<session>
<ejb-name>HelloWorldEJB</ejb-name>
<home>br.com.MyBeanRemoteHome</home>
<remote>br.com.MyBeanRemote</remote>
<local-home>br.com.MyBeanLocalHome</local-home>
<local>br.com.MyBeanLocal</local>
<ejb-class>br.com.MyBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
如果您沒有本地EJB對象從部署描述符除去上述
<local-home>br.com.MyBeanLocalHome</local-home>
<local>br.com.MyBeanLocal</local>
如果沒有遠程EJB對象從部署描述符除去上述
xml文件
<home>br.com.MyBeanRemoteHome</home>
<remote>br.com.MyBeanRemote</remote>
,放入META-INF目錄
我們的jar文件w ^生病包含以下
/META-INF/ejb-jar.xml
br.com.MyBean.class
br.com.MyBeanRemote.class
br.com.MyBeanRemoteHome.class
現在我們的EJB 3.0
// or @Local
// You can not put @Remote and @Local at the same time
@Remote
public interface MyBean {
void doSomething();
}
@Stateless
public class MyBeanStateless implements MyBean {
public void doSomething() {
}
}
閒來無事,
在JBoss中,把jar文件中
<JBOSS_HOME>/server/default/deploy
在太陽的應用服務器的訪問,以便當你部署在NetBeans應用程序時有一些問題想部署ejb-jar文件
管理控制檯
http://127.0.0.1:4848/asadmin
並獲得EJB模塊(啓動起來之後)我建議以下
- 創建一個簡單的Java庫項目(一個簡單的罐子沒有一個主要方法)
- 添加/服務器/默認/ lib目錄(包含爲了你retriev jar文件你e EJB的)jar文件到您的Java應用程序,無論您是使用JBoss(我不知道是哪個目錄在Sun Application Server)的
- 實現上述
代碼現在,創建另一個戰爭PROJECT
- 添加上面創建的項目並添加<JBOSS_HOME>/client(包含jar文件以訪問我們的EJB)。我再次不知道Sun Application Server中的哪個目錄。刪除它的文檔。
- 見如圖答案
,實施您的Servlet或別的東西,下面的代碼的頂部全球映射地址是否正在使用JBoss
public static Context getInitialContext() throws javax.naming.NamingException {
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
p.put(Context.URL_PKG_PREFIXES, " org.jboss.naming:org.jnp.interfaces");
p.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099");
return new javax.naming.InitialContext(p);
}
或下是否你正在使用Sun應用服務器 - 將文件appserv-rt.jar(我不知道哪個過去包含appserv-rt。在classpath的jar孫Application Server)的
public static Context getInitialContext() throws javax.naming.NamingException {
return new javax.naming.InitialContext();
}
爲了訪問我們的servlet的EJB或者
MyBeanRemote myBean = (MyBeanRemote) getInitialContext().lookup(<PUT_EJB_GLOBAL_ADDRESS_RIGHT_HERE>);
myBean.doSomething();
方面的東西,
你能提供一個堆棧跟蹤?代碼是在容器的外部還是內部執行? – 2009-09-24 20:29:53
請參閱我的編輯 – Drake 2009-09-24 20:46:45
請添加您的部署描述符。 – 2009-09-24 20:54:14