首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Session Bean 部署與客戶端開發 (二):deploytool 配置、JNDI 查找與除錯指南

     編輯:Java 相關知識

EJB 部署模式:配置而非執行

EJB 不直接執行,而是透過部署工具打包配置,生成含部署描述符的 JAR/EAR,再部署至應用伺服器。各廠商提供專屬工具 (Sun deploytool、WebLogic Console、JBoss CLI 等),流程大同小異。

J2EE SDK deploytool 完整操作流程

1. 建立 Enterprise Application

  • File → New Application
  • 指定 EAR 檔名 (如 HelloWorld.ear)

2. 新增 Enterprise Bean

  • File → New Enterprise Bean
  • Add Class Files:選擇 HelloWorldSession.class、HelloWorldSessionHome.class、HelloWorldSessionImpl.class

3. 指定 Bean 角色類別

角色類別
Enterprise Bean ClassHelloWorldSessionImpl
Home InterfaceHelloWorldSessionHome
Remote InterfaceHelloWorldSession
  • Display Name:工具顯示用名稱
  • Bean Type:Stateful Session Bean (本範例)

4. 部署應用

  • 確認 EJB Server 運行中
  • Tools → Deploy Application
  • 生成 Client JAR:勾選並指定檔名 (如 helloClient.jar),含 Stub/Tie 類別
  • 指定 JNDI Name:HelloWorld (客戶端查找鍵值)

客戶端開發核心:JNDI 查找與 PortableRemoteObject

取得 InitialContext


// 方式 1:預設環境 (需 JVM 參數指定 factory)
Context ctx = new InitialContext();

// 方式 2:程式化指定 Properties (WebLogic 範例)
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
props.put(Context.PROVIDER_URL, "t3://localhost:7001");
Context ctx = new InitialContext(props);

查找 Home 介面並窄化


// 必須使用 PortableRemoteObject.narrow,不可直接 (HomeInterface) ctx.lookup()
HelloWorldSessionHome home = (HelloWorldSessionHome) 
    PortableRemoteObject.narrow(ctx.lookup("HelloWorld"), HelloWorldSessionHome.class);

原因:EJB 使用 RMI-IIOP,遠端物件參考需經 CORBA 窄化轉換,標準 Java 強制轉換無效。

建立 Bean 並呼叫業務方法


HelloWorldSession session = (HelloWorldSession) home.create();
// 或帶參數建立 (若 Home 定義多載 create)
HelloWorldSession session2 = (HelloWorldSession) home.create("Guten Tag!");

System.out.println(session.getGreeting());
session.setGreeting("Howdy!");
System.out.println(session.getGreeting());

session.remove(); // 釋放 Bean

完整客戶端範例:TestHello.java


package usingj2ee.hello;
import java.util.*;
import javax.naming.*;
import javax.rmi.*;

public class TestHello {
    public static void main(String[] args) {
        try {
            Context ctx = new InitialContext();
            HelloWorldSessionHome home = (HelloWorldSessionHome) 
                PortableRemoteObject.narrow(ctx.lookup("HelloWorld"), HelloWorldSessionHome.class);
            
            HelloWorldSession session = (HelloWorldSession) home.create();
            System.out.println("預設問候: " + session.getGreeting());
            
            session.setGreeting("Howdy!");
            System.out.println("修改後: " + session.getGreeting());
            
            session.remove();
            
            // 重新建立帶參數會話
            session = (HelloWorldSession) home.create("Guten Tag!");
            System.out.println("新會話: " + session.getGreeting());
            session.remove();
        } catch (Exception e) { e.printStackTrace(); }
    }
}

跨廠商部署差異對照

項目Sun J2EE SDKBEA WebLogicJBoss
部署工具deploytool (GUI)Console / Ant Task / WLDeployManagement Console / CLI / Maven
Client JAR需明確生成動態生成,通常不需額外 JAR需生成 (client.jar)
JNDI Factorycom.sun.jndi.cosnaming.CNCtxFactoryweblogic.jndi.WLInitialContextFactoryorg.jnp.interfaces.NamingContextFactory
DataSource 配置deploytool 資源參考config.xml / Console 設定*-ds.xml / 管理主控台

常見執行期問題排查

  1. 找不到 JNDI 服務
    • EJB Server 未啟動
    • InitialContext Factory 類別錯誤或未設定
    • JNDI 名稱大小寫不符 (區分大小寫)
    • Bean 未成功部署或已被移除
  2. DataSource 存取失敗
    • 資源參考未在部署描述符定義
    • 邏輯名稱 (java:comp/env/jdbc/xxx) 未綁定實體 DataSource
    • 資料庫驅動程式未置於 Server classpath
  3. ClassCastException 於 narrow
    • 查找名稱錯誤,取得非預期物件
    • Home 介面類別版本不一致 (Client JAR 與 Server 部署版本不同)

最佳實踐建議

  • 將 JNDI 設定外部化:使用 jndi.properties 檔案或資源檔,避免硬編碼 Factory 類別
  • Client JAR 納入版本控管,確保客戶端/伺服器介面類別一致
  • 部署腳本化 (Ant/Maven),實現持續整合自動化部署
  • 啟用部署工具 Verifier/Compliance Check,預先攔截規範違規

結語

EJB 部署與客戶端開發的核心在於:部署工具生成正確描述符、JNDI 邏輯名稱正確綁定、客戶端正確使用 PortableRemoteObject.narrow。掌握 deploytool 操作流程、理解 RMI-IIOP 窄化機制、熟悉跨廠商差異,是 EJB 開發者必備的工程化技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved