0

Eclipse を使用して EJB プロジェクトを作成し、以下の 2 つのクラスを作成しました。

package com.abhijit.ejbs;

import java.util.List;

import javax.ejb.Remote;

@Remote
public interface TestEJBRemote {

    public void addElement(int a);
    public void removeElement(int a);
    public List getElements();


}

以下の実際のEJB -

package com.abhijit.ejbs;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateful;

/**
 * Session Bean implementation class TesEJB
 */
@Stateful
@LocalBean
public class TestEJB implements TestEJBRemote {

    List <Integer> myList = new ArrayList<>();
    /**
     * Default constructor. 
     */
    public TestEJB() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void addElement(int a) {
        myList.add(a);
    }

    @Override
    public void removeElement(int a) {
        myList.remove(a);
    }

    @Override
    public List getElements() {
        return myList;
    }

}

この EJB は JBoss AS 7 にデプロイされ、エラーなしで実行されます。コンソールに次のメッセージが表示されます -

**java:global/EJB1/TestEJB!com.abhijit.ejbs.TestEJBRemote
java:app/EJB1/TestEJB!com.abhijit.ejbs.TestEJBRemote
java:module/TestEJB!com.abhijit.ejbs.TestEJBRemote
java:jboss/exported/EJB1/TestEJB!com.abhijit.ejbs.TestEJBRemote
java:global/EJB1/TestEJB!com.abhijit.ejbs.TestEJB
java:app/EJB1/TestEJB!com.abhijit.ejbs.TestEJB
java:module/TestEJB!com.abhijit.ejbs.TestEJB**

今、私は 2 番目の Eclipse Java プロジェクトを作成し、以下のように単純な Java リモート クライアント コードを作成しています -

package com;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.abhijit.ejbs.TestEJB;
import com.abhijit.ejbs.TestEJBRemote;

public class EJBClient {

    public static void main(String[] args) {
        TestEJBRemote values; 

        try {
            System.out.println("----");

            final Hashtable<String, String> jndiProperties = new Hashtable();
            jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");

            //tried with rmi:  also .. not working....
            jndiProperties.put(Context.PROVIDER_URL, "ejb://localhost:1099");

            InitialContext ic = new InitialContext(jndiProperties);

            values = (TestEJBRemote)ic.lookup("java:global/EJB1/TestEJB!com.abhijit.ejbs.TestEJB");
            System.out.println("---" + values.getElements());
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

lookup() でさまざまな組み合わせを試しましたが、別の JVM で実行されるこの Java クライアント コードを実行すると、機能しません。このエラーが発生します -

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
    at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.lookup(Unknown Source)
    at com.EJBClient.main(EJBClient.java:25)

私はそれがjndiパラメータと関係があるに違いないと確信しています..しかし、私はそれが何であるかを理解していません...

4

2 に答える 2

0

接続しようとしている方法が間違っています。

リモート ejb に接続するための形式は次のとおりです。

// Create a look up string name
String name = "ejb:" + appName + "/" + moduleName + "/" + distinctName
            + "/" + beanName + "!" + interfaceName;

SO Documentation に以下を寄稿しました。


JBoss AS 7.1 で EJB を設定する

1。概要

この記事では、Enterprise JavaBeans (EJB) を使い始める方法について説明します。JBoss AS 7.1.1.Final を使用しますが、任意のサーバーを自由に使用できます。

2. Bean の Maven 依存関係

EJB を使用するには、その最新バージョンを pom.xml ファイルの依存関係セクションに追加してください。

<dependency>
    <groupId>org.jboss.spec.javax.ejb</groupId>
    <artifactId>jboss-ejb-api_3.2_spec</artifactId>
    <version>1.0.0.Final</version>
</dependency>

このチュートリアルではアプリケーション サーバーとして JBoss を使用するため、JBoss の依存関係を適切に追加してください。チュートリアルの後半では、プロジェクトの Maven ビルドをセットアップする方法について詳しく説明します。

3.EJB リモート

まず、HelloWorldRemote という Bean インターフェースを作成しましょう。

public interface HelloWorldRemote {
    public String getHelloWorld();
}

ここで、上記のインターフェースを実装し、名前をHelloWorldBean.

@Stateless
public class HelloWorldBean implements HelloWorldRemote {

    public HelloWorldBean() {
    
    }
    
    @Override
    public String getHelloWorld(){
        return ("Hello World");
    }
}

@Statelessクラス宣言の上の表記に注意してください。これは、ステートレス セッション Bean を示します。

4. リモート Bean の Maven セットアップ

このセクションでは、サーバー上でアプリケーションをビルドして実行するように maven をセットアップする方法について説明します。

プラグインを1つずつ見てみましょう。

4.1. コンパイラ プラグイン

maven-compiler-plugin は、プロジェクトのソースをコンパイルするために使用されます。

ここでは、バージョン 2.3.1 のプラグインを使用し、ソースとターゲットの JDK を設定で 1.7 に設定しました。

これらの設定をタグ内のプロパティとして定義し、${property} を介して参照しています。

<version.compiler.plugin>2.3.1</version.compiler.plugin>
<!-- maven-compiler-plugin -->
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.source>1.7</maven.compiler.source>

4.2 EJB プラグイン

このプラグインは、Bean ファイルと関連するクライアント jar を生成します。

ejb バージョンを 3.2 に指定し、generateClient プロパティを true に設定して、クライアントを生成します。

4.3 JBoss でのデプロイ

jboss-as-maven-plugin は、JBoss AS 7 でアプリケーションをデプロイ、再デプロイ、アンデプロイ、または実行するために使用されます。

この構成では、プロジェクトのビルド ファイル名と同じビルド ファイル名を指定しますejb-remote-1.0-SNAPSHOT

4.4 EJB に必要な Maven 依存関係

jboss-javaee-6.0 は、使用する JBoss の Java EE 6 API のバージョンを定義します。

JBoss は、部品表 (BOM) を含む Java EE 6 API の完全なセットを配布します。

BOM は、アーティファクトのスタック (またはコレクション) のバージョンを指定します。これをタグで指定して、常に正しいバージョンのアーティファクトを取得できるようにします。この依存関係自体のタイプは、必要な依存関係を含む pom です。

<dependency>
    <groupId>org.jboss.spec</groupId>
    <artifactId>jboss-javaee-6.0</artifactId>
    <version>${version.org.jboss.spec.jboss.javaee.6.0}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

4.5 注釈

以下は、注釈の依存関係を取得します。

<dependency>
    <groupId>org.jboss.spec.javax.annotation</groupId>
    <artifactId>jboss-annotations-api_1.1_spec</artifactId>
    <scope>provided</scope>
</dependency>

4.6 EJB バージョン 3.2

次のコードでは、仕様の最新バージョンを取得します。

<dependency>
    <groupId>org.jboss.spec.javax.ejb</groupId>
    <artifactId>jboss-ejb-api_3.2_spec</artifactId>
    <version>1.0.0.Final</version>
</dependency>

上記のプロジェクトを JBoss サーバーで実行するには、最初に以下を実行する必要があります。

mvn clean install

次に、次の maven コマンドを実行して、実行中の JBoss サーバーにデプロイする必要があります。

jboss-as:deploy

jboss サーバーにデプロイされている jar ファイルが表示されます。

または、プロジェクトのターゲット フォルダーから使用可能な jar をコピーして、サーバーの webapp フォルダーに貼り付けることもできます。

5. クライアント プロジェクトの設定

リモート Bean を作成したら、クライアントを作成して、デプロイされた Bean をテストする必要があります。

まず、プロジェクトの Maven セットアップについて説明します。

5.1 使用される Maven プラグイン

プロジェクトのソースをコンパイルするには、maven-compiler-plugin を使用します。

ソース クラスとターゲット クラスの jdk 1.7 バージョンを指定しました。

私たちのクライアントはexec-maven-pluginJava プログラムです。それを実行するには、システムおよび Java プログラムの実行に役立つ を使用します。実行可能ファイル (つまり java)、クラスパス、および Java クラス (com.baeldung.ejb.client.Client) を指定する必要があります。

プラグインには、提供された依存関係に基づいて必要なクラスパス引数が含まれているため、クラスパスは空のままです。

5.2 EJB3 クライアントの Maven 依存関係

EJB3 クライアントを実行するには、次の依存関係を含める必要があります。

このアプリケーションの EJB リモート ビジネス インターフェースに依存して、クライアントを実行します。そのため、ejb クライアントの jar 依存関係を指定する必要があります。値が「ejb-client」のタグは、EJB クライアント jar に対するこのプロジェクトの依存関係を指定するために使用されます。

<dependency>
    <groupId>com.theopentutorials.ejb3</groupId>
    <artifactId>ejbmavendemo</artifactId>
    <type>ejb-client</type>
    <version>${project.version}</version>
</dependency>

依存関係jboss-transaction-api_1.1_specjboss-ejb-api_3.1_specjboss-ejb-clientxnio-apixnio-niojboss-remotingは、コンパイル時ではなく実行時に必要なため、ランタイムとしてスコープを持ちますjboss-sasljboss-marshalling-river

dependencyManagement の下の依存関係jboss-javaee-6.0およびjboss-as-ejb-client-bomには、インポートとしてのスコープがあります。これは、リモート POM からの依存関係管理情報を現在のプロジェクトに含めるために使用されます。これらのリモート POM は、クライアントを実行するために必要な依存関係を含む JBoss によって提供されます。

5.3 JBoss EJB クライアントのプロパティ

「src/main/resources」の下にファイルを作成し、jboss-ejb-client.properties という名前を付けます。

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port = 4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

6. クライアント クラスの作成

まず、ClientUtility クラスを作成します。

public class ClientUtility {
    private static Context initialContext;
    private static final String PKG_INTERFACES = "org.jboss.ejb.client.naming";

    public static Context getInitialContext() throws NamingException {
        if (initialContext == null) {
            Properties properties = new Properties();
            properties.put(Context.URL_PKG_PREFIXES, PKG_INTERFACES);
            initialContext = new InitialContext(properties);
         }
        return initialContext;
    }
}

次に、サーバーにデプロイした Bean を消費する実際の Client クラスを作成しましょう。

public class Client {
    
    //The lookup method to get the EJB name
    private static HelloWorldRemote doLookup() {
        Context context = null;
        HelloWorldRemote bean = null;
        try {
            // 1. Obtaining Context
            context = ClientUtility.getInitialContext();
            // 2. Generate JNDI Lookup name
            String lookupName = getLookupName();
            // 3. Lookup and cast
            bean = (HelloWorldRemote) context.lookup(lookupName);
 
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return bean;
    }
 
    private static String getLookupName() {
        
         // The app name is the EAR name of the deployed EJB without .ear suffix.
         // Since we haven't deployed the application as a .ear, the app name for
         // us will be an empty string
         
        String appName = "";
 
        
         // The module name is the JAR name of the deployed EJB without the .jar
         // suffix.
        String moduleName = "ejb-remote-0.0.1-SNAPSHOT";
 
        
        // AS7 allows each deployment to have an (optional) distinct name. This
        // can be an empty string if distinct name is not specified.
        String distinctName = "";
 
        // The EJB bean implementation class name
        String beanName = "HelloWorldBean";
 
        // Fully qualified remote interface name
        final String interfaceName = "com.baeldung.ejb.tutorial.HelloWorldRemote";
 
        // Create a look up string name
        String name = "ejb:" + appName + "/" + moduleName + "/" + distinctName
                + "/" + beanName + "!" + interfaceName;
        
        return name;
    }
}

Client クラスは Bean を消費し、結果を出力します。

7. 結論

そのため、サービスを利用する EJB サーバーとクライアントを作成しました。プロジェクトは、任意のアプリケーション サーバーで実行できます。

于 2016-12-19T18:55:26.400 に答える