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

EJB 3 開發指南(1):編寫第一個無狀態 SessionBean 完整入門

     編輯:Java 相關知識

Stateless Session Bean 是 EJB 3 最基礎、最常用的元件類型,適合無狀態業務邏輯處理。本文從開發環境建置、專案建立、介面與 Bean 實作、打包部署、客戶端呼叫,完整呈現第一個 EJB 3 專案的誕生流程。

一、開發環境版本

  • Eclipse:3.4.2 (Eclipse IDE for Java EE Developers)
  • JBoss AS:5.0.1
  • JDK:1.6.0_14

二、JBoss 綁定位址配置 (關鍵)

JBoss 4.2+ 預設僅綁定 127.0.0.1,遠端存取需指定 -b 參數:

run.bat -b 0.0.0.0          # 綁定所有網卡,接受任意 IP 連線
run.bat -b 192.168.1.100    # 綁定特定 IP

Eclipse 運行配置:
Run Configurations → Arguments → VM arguments 加入:-b 0.0.0.0

Eclipse JBoss 運行配置 -b 參數

未設定 -b 時遠端呼叫會拋出:
Connection refused: connect / CommunicationException

三、建立 EJB 專案

  1. File → New → EJB Project,專案名:MyEJB
  2. Target Runtime 選擇配置好的 JBoss 5.0 Runtime
  3. EJB Module 版本選 3.0

四、遠端業務介面

package service;

import java.util.List;
import javax.ejb.Remote;
import entity.Greeting;

@Remote
public interface Greeter {
    String greet(String message);
    List<Greeting> getAllGreetings();
}

五、可序列化實體類別

package entity;

import java.io.Serializable;

public class Greeting implements Serializable {
    private int id;
    private String name;
    // getter/setter 略
    // 實作 Serializable 才能跨 JVM 傳遞
}

六、Stateless Bean 實作

package service;

import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import entity.Greeting;

@Stateless
public class GreeterBean implements Greeter {

    @Override
    public List<Greeting> getAllGreetings() {
        List<Greeting> list = new ArrayList<Greeting>();
        Greeting g1 = new Greeting(); g1.setId(12); g1.setName("bill gates"); list.add(g1);
        Greeting g2 = new Greeting(); g2.setId(334); g2.setName("李寧"); list.add(g2);
        return list;
    }

    @Override
    public String greet(String message) {
        return "您好 " + message;
    }
}

關鍵註解

  • @Stateless:聲明為無狀態 Session Bean
  • @Remote (在介面上):聲明為遠端業務介面
  • 無需實作 SessionBean 介面、無需 ejbCreate 等回呼方法 (EJB 2.x 遺物)

七、自動部署與 JAR 結構

Eclipse 配置 JBoss Runtime 後,儲存檔案自動編譯打包部署至 $JBOSS_HOME/server/default/deploy:

MyEJB.jar
├── entity/
│   └── Greeting.class
├── service/
│   ├── Greeter.class
│   └── GreeterBean.class
└── META-INF/
    ├── MANIFEST.MF
    └── jboss.xml (Eclipse 自動生成,可指定 JNDI 名稱)

八、客戶端程式碼 (兩種配置方式)

方式 1:程式碼設定 Properties

package test;

import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import service.Greeter;

public class Client {
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.setProperty(Context.PROVIDER_URL, "192.168.17.105:1099");
        prop.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        InitialContext ctx = new InitialContext(prop);

        Greeter greeter = (Greeter) ctx.lookup("GreeterBean/remote");
        System.out.println(greeter.greet("李寧"));
        System.out.println(greeter.getAllGreetings().get(0).getName());
    }
}

方式 2:jndi.properties 檔案 (推薦)

專案 src 目錄建立 jndi.properties:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=192.168.17.105:1099

客戶端簡化為:

InitialContext ctx = new InitialContext();
Greeter greeter = (Greeter) ctx.lookup("GreeterBean/remote");
System.out.println(greeter.greet("李寧"));
System.out.println(greeter.getAllGreetings().get(0).getName());

九、執行結果

您好 李寧
bill gates

十、客戶端專案依賴 JAR

必須加入 $JBOSS_HOME/client 目錄下所有 JAR 至 Classpath:

  • jbossall-client.jar
  • jnp-client.jar
  • jboss-common-core.jar
  • ... 等所有 client 目錄下的 jar

十一、JNDI 命名規則總結

十二、常見啟動錯誤排查

部署單元預設 JNDI 名稱範例
EAR耳名/Bean名/remoteMyEnterprise/GreeterBean/remote
JARBean名/remoteGreeterBean/remote
錯誤原因解決
Connection refusedJBoss 未啟動或 -b 參數錯誤檢查 JBoss 進程、確認 -b 0.0.0.0
ClassNotFoundException: org.jnp.interfaces.NamingContextFactory客戶端缺少 jnp-client.jar加入 $JBOSS_HOME/client 所有 jar
NameNotFoundException: GreeterBean not boundJNDI 名稱錯誤或 Bean 未部署查看 JBoss JMX Console → JNDIView 確認實際綁定名稱
InvalidInvocationException序列化版本不匹配確保客戶端與伺服端共用相同介面/實體類別 JAR
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved