11

NetBeansを使用して、を含むクラスで次のことを行います。main()これは機能します。

import javax.ejb.EJB;

public class Master {
    @EJB
    TestBeanARemote x;

    public static void main(String[] args) {
        Master m = new Master();
        m.doStuff();
    }
//doStuff includes x, but it works, so who cares.
...

ただし、呼び出されたクラスでこれを行うと、失敗します。呼び出されたクラスでは、アノテーションの使用を避け、代わりにInitialContext()セットアップ全体を使用する必要があるようです。

String testRun(String arg) {
   InitialContext ic;
    try {
        ic = new InitialContext();
        x = (TestBeanARemote) ic.lookup("com.bnncpa.testing.TestBeanARemote");
        return x.testRun(arg);

    }

失敗した完全なコピーは次のとおりです。

package enterpriseapplication1;
public class Main {

    private Secondary x = new Secondary();

    public static void main(String[] args) {
        Main m = new Main();
        m.doStuff();
    }

    public void doStuff() {
        System.out.println(x.testRun("bar"));
    }

}

package enterpriseapplication1;
import org.mine.testing.TestBeanARemote;
import javax.ejb.EJB;

public class Secondary {
   @EJB
   static private TestBeanARemote x;

   String testRun(String arg) {
       return x.testRun(arg);
   }
}

@EJBパッケージのすべてのクラスで機能しない可能性がある特別な理由はありますか?@EJB使用している場所ならどこでも簡単にタグ付けできるようにしたいと思います。

私が完全に見逃しているこれを回避するためのより良い方法はありますか?


編集:appclientの使用に関する懸念に対処するために、ここに私のスタックトレースがあります:

May 11, 2009 4:24:46 PM com.sun.enterprise.appclient.MainWithModuleSupport <init>
WARNING: ACC003: Application threw an exception.
java.lang.NullPointerException
    at enterpriseapplication1.Secondary.testRun(Secondary.java:20)
    at enterpriseapplication1.Main.doStuff(Main.java:27)
    at enterpriseapplication1.Main.main(Main.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.enterprise.util.Utility.invokeApplicationMain(Utility.java:266)
    at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:449)
    at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:259)
    at com.sun.enterprise.appclient.Main.main(Main.java:200)
Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:461)
    at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:259)
    at com.sun.enterprise.appclient.Main.main(Main.java:200)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.enterprise.util.Utility.invokeApplicationMain(Utility.java:266)
    at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:449)
    ... 2 more
Caused by: java.lang.NullPointerException
    at enterpriseapplication1.Secondary.testRun(Secondary.java:20)
    at enterpriseapplication1.Main.doStuff(Main.java:27)
    at enterpriseapplication1.Main.main(Main.java:23)
    ... 8 more
Java Result: 1
4

2 に答える 2

12

問題は、@EJB が「マネージド」クラスにのみ注入されることです。

Java EE には、マネージド クラスがほとんどありません。特に、アプリケーション クライアント (この場合は「メイン」)、EJB (ステートレスおよびステートフル EJB、メッセージ Bean など)、およびサーブレットです。

それ以外のもの (つまり、ジェネリック クラス、JPA エンティティなど) にはリソースが注入されないため、リソースにアクセスするにはルックアップ メカニズムに依存する必要があります。

于 2009-05-11T20:43:33.707 に答える
0

Glassfish は、いわゆる「アプリケーション クライアント コンテナー」を介して、Java EE コンテナー (小さなアプリ、Swing クライアントなど) で実行されていないクライアント アプリでの EJB の注入をサポートします。

記録のために、私がよく覚えていれば、次のようなものを使用する必要がありました

x = (TestBeanARemote) PortableRemoteObject.narrow(ic.lookup("com.bnncpa.testing.TestBeanARemote"), TestBeanARemote.class)

これは Weblogic 10 の <=EJB 2.1 で使用されていましたが、サポートされており、EJB 3 (JavaEE 5) を使用していました。これは、以前のバージョンで必要な EJB 2.1 スタイルのインターフェースを生成することによって EJB3 をサポートする Weblogic の方法が原因であると考えられます。彼らがすでにそれを修正したかどうかはわかりません。

于 2011-08-12T15:11:01.250 に答える