Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема вызова Session Bean (Java EE5) / 16 сообщений из 16, страница 1 из 1
10.03.2007, 14:01:03
    #34381958
KBoris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
Всем привет!
Возникла такая проблема, при вызове сессионного бина, который управляет персистентными бинами (создает, удалет, редактирует), из клиентского приложения возникает NullPointerException. Очень нужна помощь...
Вот код (в нем даже не используются персистентные бины):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
 package  test;

 import  javax.ejb.EJB;
 import  org.cetco.request.RequestProcessorRemote;

 public   class  Client {

    @EJB
     private   static  RequestProcessorRemote requestProcessorBean;
   
    /** Creates a new instance of Client */
     public  Client(String[] args) {
    }
    
    /**
     * @param args the command line arguments
     */
     public   static   void  main(String[] args) {
        // TODO code application logic here
        System.out.println("Client Entry Point");
        Client client =  new  Client(args);
        client.test();
    }
    
     public   void  test() {
         try  {
            System.out.println("Start creating company");
            //requestProcessorBean = new RequestProcessorRemote();
            System.out.println(requestProcessorBean.sayHello("Test"));
        }  catch (Exception ex) {
            System.out.println("Exception " + ex.toString());
            ex.printStackTrace();
        }
    }    
}

вот код интерфейса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 import  javax.ejb.Remote;


/**
 * This is the business interface for RequestProcessor enterprise bean.
 */
@Remote
 public   interface  RequestProcessorRemote {
     public  String sayHello(String name);
}

и код сессионного бина

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 import  javax.ejb.Stateless;

/**
 *
 * @author BN
 */
@Stateless
 public   class  RequestProcessorBean  implements  org.cetco.request.RequestProcessorRemote {
    
     public  String sayHello(String name) {
         return ("Hello"+name);
    }
}

и собственно ошибка:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
run-tool:
Client Entry Point
Start creating company
Exception java.lang.NullPointerException
java.lang.NullPointerException
        at cetco.Client.test(Client.java: 42 )
        at cetco.Client.main(Client.java: 35 )
        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: 232 )
        at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java: 329 )
        at com.sun.enterprise.appclient.Main.main(Main.java: 180 )
run-jar:
run-display-browser:
run:
BUILD SUCCESSFUL (total time:  43  seconds)

Очень нужна помощь!!!!
...
Рейтинг: 0 / 0
10.03.2007, 19:53:09
    #34382208
y3u
y3u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
ну и толку с такого стектрейса, если эксцепшен в 42 строке, а в исходнике 35 строк...
К тому же, так EJB не тестируют таким образом, они так точно не будут работать. Их надо сначала задеплоить в контейнере, а потом через JNDI доставать и пользовать...
...
Рейтинг: 0 / 0
10.03.2007, 19:55:44
    #34382210
y3u
y3u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
RTFM
http://java.sun.com/javaee/5/docs/tutorial/doc/
...
Рейтинг: 0 / 0
11.03.2007, 13:40:29
    #34382633
KBoris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
y3uRTFM
http://java.sun.com/javaee/5/docs/tutorial/doc/

Собственно по этому туториалу и изучаю...
IDE NetBeans 5.5. Среда вроде при запуске деплоит приложение, к тому же подобная ошибка возникает и при попытке запустить примеры из туториала что наводит на мысль, что проблема может быть и не в коде.

а эксепшн вылетает на строке:
Код: plaintext
1.
2.
3.
...
System.out.println(requestProcessorBean.sayHello("Test"));
...
...
Рейтинг: 0 / 0
11.03.2007, 22:46:59
    #34383089
y3u
y3u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
KBoris y3uRTFM
http://java.sun.com/javaee/5/docs/tutorial/doc/

Собственно по этому туториалу и изучаю...
IDE NetBeans 5.5. Среда вроде при запуске деплоит приложение, к тому же подобная ошибка возникает и при попытке запустить примеры из туториала что наводит на мысль, что проблема может быть и не в коде.

а эксепшн вылетает на строке:
Код: plaintext
1.
2.
3.
...
System.out.println(requestProcessorBean.sayHello("Test"));
...


Ага, счаз... деплоит... А какой аппликейшен сервер используется? Глассфиш, джейбосс, или еще какой? Раз вылетает эксцепшен, значит нет экземпляра класса RequestProcessorRemote, т.е. requestProcessorBean попросту null. Посмотри что у тебя есть в JNDI, попробуй отлукапить ручками бин...
...
Рейтинг: 0 / 0
12.03.2007, 00:04:41
    #34383131
KBoris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
В принципе я заставил этот код работать, прописав:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
            System.out.println("Start creating company");
            //requestProcessorBean = new RequestProcessorRemote();
           requestProcessorBean =  [b]new  RequestProcessorBean();[/b]
            
            System.out.println(requestProcessorBean.sayHello("Test"));
...

но остался вопрос, если я описываю requestProcessorBean так:
Код: plaintext
1.
2.
    @EJB
     private   static  RequestProcessorRemote requestProcessorBean;

что является интерфейсом, то почему я должен создавать экземпляр самого бина?

Кто знает, плиз, объясните...
...
Рейтинг: 0 / 0
12.03.2007, 00:06:06
    #34383133
KBoris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
А сервер использую Sun Appication Server 9
...
Рейтинг: 0 / 0
12.03.2007, 08:28:45
    #34383282
Ekshibarov Vladimir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
KBorisВ принципе я заставил этот код работать, прописав:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
            System.out.println("Start creating company");
            //requestProcessorBean = new RequestProcessorRemote();
           requestProcessorBean =  [b]new  RequestProcessorBean();[/b]
            
            System.out.println(requestProcessorBean.sayHello("Test"));
...

но остался вопрос, если я описываю requestProcessorBean так:
Код: plaintext
1.
2.
    @EJB
     private   static  RequestProcessorRemote requestProcessorBean;

что является интерфейсом, то почему я должен создавать экземпляр самого бина?

Кто знает, плиз, объясните...

Код то вы заставили работать но не совсем так как нужно, здесь вы создали просто экземпляр класса RequestProcessorBean и вызвали его метод на клиенте, то есть запрос к серверу у вас вообще не совершался.

А вообще что бы произошел injection в поле описанное у вас:
Код: plaintext
1.
2.
    @EJB
     private   static  RequestProcessorRemote requestProcessorBean;
не обходимо запускать клиента с помощью утилитки appclient (точно не помню, но помоему так называется), которая поставляется в Sun app server.
...
Рейтинг: 0 / 0
12.03.2007, 09:03:04
    #34383308
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
1) Использовать appclient НЕобязательно
2) Получать ссылку на удалённый интерфейс так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     public   static  RequestProcessorRemote getRequestProcessorRemote()  throws  NamingException {
        
        Context ic =  new  InitialContext();
         return  (RequestProcessorRemote) ic.lookup("RequestProcessorRemote");
        
    }
...
requestProcessorBean = getRequestProcessorBean();
2) При запуске указать аргументы(для NetBeans в свойствах проекта -> Run -> VM Options)
Код: plaintext
-Dorg.omg.CORBA.ORBInitialHost=localhost -Dorg.omg.CORBA.ORBInitialPort= 3700 
если AppServer удалённый, localhost заменить на хост на котором работает AppServer
3) Добавить в CLASSPATH библиотеки AppServer'а(для NetBeans в свойствах проекта -> Libraries):
Код: plaintext
1.
${AS_ROOT}/lib/appserv-rt.jar
${AS_ROOT}/lib/javaee.jar
...
Рейтинг: 0 / 0
12.03.2007, 09:05:09
    #34383313
Ekshibarov Vladimir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
mozheyko_d1) Использовать appclient НЕобязательно
2) Получать ссылку на удалённый интерфейс так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     public   static  RequestProcessorRemote getRequestProcessorRemote()  throws  NamingException {
        
        Context ic =  new  InitialContext();
         return  (RequestProcessorRemote) ic.lookup("RequestProcessorRemote");
        
    }
...
requestProcessorBean = getRequestProcessorBean();
2) При запуске указать аргументы(для NetBeans в свойствах проекта -> Run -> VM Options)
Код: plaintext
-Dorg.omg.CORBA.ORBInitialHost=localhost -Dorg.omg.CORBA.ORBInitialPort= 3700 
если AppServer удалённый, localhost заменить на хост на котором работает AppServer
3) Добавить в CLASSPATH библиотеки AppServer'а(для NetBeans в свойствах проекта -> Libraries):
Код: plaintext
1.
${AS_ROOT}/lib/appserv-rt.jar
${AS_ROOT}/lib/javaee.jar


Я говорил что использовать appclient нужно для injection, конечно используя lookup можно получить ссылку на удаленный интерфейс и без appclient.
...
Рейтинг: 0 / 0
12.03.2007, 09:14:22
    #34383328
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
Ekshibarov Vladimir mozheyko_d1) Использовать appclient НЕобязательно
2) Получать ссылку на удалённый интерфейс так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     public   static  RequestProcessorRemote getRequestProcessorRemote()  throws  NamingException {
        
        Context ic =  new  InitialContext();
         return  (RequestProcessorRemote) ic.lookup("RequestProcessorRemote");
        
    }
...
requestProcessorBean = getRequestProcessorBean();
2) При запуске указать аргументы(для NetBeans в свойствах проекта -> Run -> VM Options)
Код: plaintext
-Dorg.omg.CORBA.ORBInitialHost=localhost -Dorg.omg.CORBA.ORBInitialPort= 3700 
если AppServer удалённый, localhost заменить на хост на котором работает AppServer
3) Добавить в CLASSPATH библиотеки AppServer'а(для NetBeans в свойствах проекта -> Libraries):
Код: plaintext
1.
${AS_ROOT}/lib/appserv-rt.jar
${AS_ROOT}/lib/javaee.jar


Я говорил что использовать appclient нужно для injection, конечно используя lookup можно получить ссылку на удаленный интерфейс и без appclient.

А я не говорил что использовать appclient & injection нельзя или неправильно, я сказал что НЕобязательно

В данном случае, ИМХО, injection не упрощает, а усложняет, т.к. тянет за собой appclient, что для туториала, на мой опять же взгляд, сложновато.
...
Рейтинг: 0 / 0
12.03.2007, 12:21:49
    #34383883
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
mozheyko_d
2) Получать ссылку на удалённый интерфейс так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     public   static  RequestProcessorRemote getRequestProcessorRemote()  throws  NamingException {
        
        Context ic =  new  InitialContext();
         return  (RequestProcessorRemote) ic.lookup("RequestProcessorRemote");
        
    }
...
requestProcessorBean = getRequestProcessorBean();

Я бы во избежание добавил:
Код: plaintext
1.
     return  (RequestProcessorRemote) PortableRemoteObject.narrow(c.lookup("RequestProcessorRemote"), RequestProcessorRemote. class );
...
Рейтинг: 0 / 0
12.03.2007, 17:28:33
    #34385086
KBoris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
Странно только что в примерах туториала этого нет...

Всем спасибо за помощь!
...
Рейтинг: 0 / 0
12.03.2007, 18:28:37
    #34385260
KBoris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
mozheyko_d1) Использовать appclient НЕобязательно
2) Получать ссылку на удалённый интерфейс так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     public   static  RequestProcessorRemote getRequestProcessorRemote()  throws  NamingException {
        
        Context ic =  new  InitialContext();
         return  (RequestProcessorRemote) ic.lookup("RequestProcessorRemote");
        
    }
...
requestProcessorBean = getRequestProcessorBean();
2) При запуске указать аргументы(для NetBeans в свойствах проекта -> Run -> VM Options)
Код: plaintext
-Dorg.omg.CORBA.ORBInitialHost=localhost -Dorg.omg.CORBA.ORBInitialPort= 3700 
если AppServer удалённый, localhost заменить на хост на котором работает AppServer
3) Добавить в CLASSPATH библиотеки AppServer'а(для NetBeans в свойствах проекта -> Libraries):
Код: plaintext
1.
${AS_ROOT}/lib/appserv-rt.jar
${AS_ROOT}/lib/javaee.jar


А как должно быть по уму, как в туториале или как у Вас написано? Т.е. я так понимаю, что после деплоимента интерфейс RequestProcessorRemote должен быть доступен всем приложениям? И настраиваться на него нужно так, как Вы описали?

и еще вопрос, где про это можно поподробней почитать и как эту кухню тестить.
Заранее благодарю!
...
Рейтинг: 0 / 0
12.03.2007, 20:06:15
    #34385487
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
KBoris mozheyko_d1) Использовать appclient НЕобязательно
2) Получать ссылку на удалённый интерфейс так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     public   static  RequestProcessorRemote getRequestProcessorRemote()  throws  NamingException {
        
        Context ic =  new  InitialContext();
         return  (RequestProcessorRemote) ic.lookup("RequestProcessorRemote");
        
    }
...
requestProcessorBean = getRequestProcessorBean();
2) При запуске указать аргументы(для NetBeans в свойствах проекта -> Run -> VM Options)
Код: plaintext
-Dorg.omg.CORBA.ORBInitialHost=localhost -Dorg.omg.CORBA.ORBInitialPort= 3700 
если AppServer удалённый, localhost заменить на хост на котором работает AppServer
3) Добавить в CLASSPATH библиотеки AppServer'а(для NetBeans в свойствах проекта -> Libraries):
Код: plaintext
1.
${AS_ROOT}/lib/appserv-rt.jar
${AS_ROOT}/lib/javaee.jar


А как должно быть по уму, как в туториале или как у Вас написано?

А это как нравится.
KBorisТ.е. я так понимаю, что после деплоимента интерфейс RequestProcessorRemote должен быть доступен всем приложениям?

Ага, но можно и защищаться
KBoris
И настраиваться на него нужно так, как Вы описали?

Можно так как я написал, а можно и как написал Ekshibarov Vladimir.
KBoris
и еще вопрос, где про это можно поподробней почитать и как эту кухню тестить.
Заранее благодарю!
тут
...
Рейтинг: 0 / 0
12.03.2007, 22:13:38
    #34385642
KBoris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема вызова Session Bean (Java EE5)
to mozheyko_d

Все, разобрался, еще нужно было в sun-ejb-jar.xml прописать имя интерфейса.

Спасибо огромное!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема вызова Session Bean (Java EE5) / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]