2009-05-11 5 views
11

Использование NetBeans, я следующий в классе, содержащем main(), и она работает:@EJB аннотаций в клиентах

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

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


Edit: Для того, чтобы решить озабоченность в связи с использованием 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 

ответ

12

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

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

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

+0

Где я объявляю, какие классы считаются управляемыми в приложении-клиенте? –

+0

Цитирование спецификации JEE 5: «Инъекция также поддерживается для основного класса клиента приложения. Поскольку контейнер клиента приложения не создает экземпляры основного класса приложения , а просто загружает класс и вызывает статический основной метод, класс клиентского приложения использует статические поля и методы, в отличие от других компонентов Java EE. Инъекция происходит до вызова основного метода. " Основной класс в JEE App Client является единственным «управляемым классом», поэтому вы можете также использовать поиск повсюду. –

+0

Нашли хорошую информацию на основе того, что вы сказали мне по адресу http://weblogs.java.net/blog/ss141213/archive/2006/03/using_java_pers_1.html Спасибо большое :) –

0

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. Не знаю, исправили ли они это.

Смежные вопросы