@EJB аннотация в клиентах - PullRequest
11 голосов
/ 11 мая 2009

Используя 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 везде, где я его использую.

Есть ли какой-нибудь лучший способ обойти это, что я полностью упускаю?


Редактировать: Чтобы решить проблему с использованием приложения, вот мой след стека:

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 голосов
/ 12 мая 2009

Проблема в том, что @EJB будет внедряться только в "управляемые" классы.

В Java EE очень мало управляемых классов. В частности, клиенты приложений (в данном случае ваш «главный»), EJB (EJB без сохранения состояния и состояния, объекты EJB и т. Д.) И сервлеты.

Все остальное (например, универсальные классы, сущности JPA и т. Д.) Не будут внедряться в ресурсы, и вам потребуется полагаться на механизм поиска для получения доступа к вашим ресурсам.

0 голосов
/ 12 августа 2011

Glassfish поддерживает внедрение EJB в клиентские приложения, не запущенные в каком-либо контейнере Java EE (ваше небольшое приложение, клиенты Swing и т. Д.) Через так называемый «контейнер клиента приложения».

Для записи, если я хорошо помню, нам пришлось использовать что-то вроде

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

, который используется в <= EJB 2.1 в Weblogic 10, хотя он поддерживает и мы использовали EJB 3 (JavaEE 5). Это было вызвано тем, что Weblogic поддерживал EJB3, генерируя в предыдущих версиях необходимые интерфейсы в стиле EJB 2.1. Не знаю, исправили ли они это. </p>

...