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 等)和 Servlet。

其他任何东西(即泛型类、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)。它认为这是由 Weblogic 支持 EJB3 的方式引起的,即在以前的版本中生成必要的 EJB 2.1 样式接口。不知道他们是否已经修复它。

于 2011-08-12T15:11:01.250 回答