代码之家  ›  专栏  ›  技术社区  ›  Jeff Ferland

@客户端中的EJB注释

  •  11
  • Jeff Ferland  · 技术社区  · 16 年前

    使用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
    
    2 回复  |  直到 12 年前
        1
  •  12
  •   Arjan Tijms Mike Van    12 年前

    问题是@ejb只能注入到“托管”类中。

    在Java EE中,很少有托管类。特别是应用程序客户机(在本例中是您的“主要”)、EJB(无状态和有状态EJB、消息bean等)和servlet。

    任何其他东西(例如通用类、JPA实体等)都不会注入资源,您需要依赖查找机制来访问资源。

        2
  •  0
  •   MarianP    13 年前

    GLAISFISH支持在客户端应用程序中注入EJB,而不是通过所谓的“应用程序客户端容器”运行在任何Java EE容器(您的小应用程序、Swing客户端等)中。

    据我所知,如果我记得清楚的话,我们必须使用

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

    它在WebLogic10的<=EJB2.1中使用,尽管它支持并且我们使用EJB3(JavaEE 5)。它认为这是由WebLogic通过在以前的版本中生成EJB2.1风格的接口来支持EJB3的方式引起的。不知道他们是否已经修好了。

    推荐文章