Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EJB variable null, В конструкторе EJB переменная null 
:(
    Опции темы
VMA
Дата 14.3.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.3.2008
Где: Самара

Репутация: нет
Всего: нет



Доброго времени суток, уважаемые!
C javой знаком я относительно недавно, поэтому в терминологии не силен
имеется проект J2EE 

Сессион бин для работы с базой
Код

@Stateless
public class UsersFacade implements UsersFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(Users users) {
        em.merge(users);
    }

    public Users edit(Users users) {
        return em.merge(users);
    }

    public void remove(Users users) {
        em.remove(em.merge(users));
    }

    public Users find(Object id) {
        return em.find(com.strategiasoft.DataBase.Users.Users.class, id);
    }

    public List<Users> findAll() {
        return em.createQuery("select object(o) from Users as o").getResultList();
    }

}


Бин UserRightsBean для jsf страницы 
Код


public class UserRightsBean {

    @EJB
    private UsersFacadeLocal usersFacade;

    private Collection<String> listUsers = new ArrayList<String>();

    //конструктор
    public UserRightsBean() {
        listUsers.clear();
        //загрузка из базы списка юзверей
        List<Users> result = usersFacade.findAll();
        for (Users users : result) {
            listUsers.add(new UserData(users.getId().toString(), users.getLogin()));
        }
    }


и вот в строке 
        List<Users> result = usersFacade.findAll();
переменная usersFacade=null, соответственно вылетает эксепшн
--------------------------------------------------------------------------------------------------------------------------

пытался избежать этой ситуации (поверил сам себе на слово, что на этапе конструктора подключение к базе ещё не инициализировано) 
создав в бине статическую переменную
Код

public class UserRightsBean {

    private static UserRightsBasic userRightsBasic = new UserRightsBasic();
    private Collection<String> listUsers;

    //конструктор
    public UserRightsBean() {
        listUsers = userRightsBasic.loadListUser();
    }


класс UserRightsBasic, где содержится вся логика работы с базой
Код

public class UserRightsBasic {

    @EJB
    private UsersFacadeLocal usersFacade;
    private Collection<String> listUsers = new ArrayList<String>();

    public UserRightsBasic() {
    }
    
    public Collection<String> loadListUser() {
        listUsers.clear();
        //загрузка из базы списка юзверей
        List<Users> result = usersFacade.findAll();
        for (Users users : result) {
            listUsers.add(users.getId().toString());
        }
        return listUsers;
    }



и тут меня постигла неудача в строке
        List<Users> result = usersFacade.findAll();
где usersFacade = null

использую GlassFishV2
для работы с базой Hibernate

Это сообщение отредактировал(а) VMA - 14.3.2008, 10:43
PM MAIL ICQ   Вверх
mbasil
Дата 15.3.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



Похоже, что впрыскивания ресурса не происходит.
Попробуйте прямым поиском в JNDI:
Код

public class UserRightsBean {
    private UsersFacadeLocal usersFacade;
    private Collection<String> listUsers = new ArrayList<String>();

    //конструктор
    public UserRightsBean() {
        listUsers.clear();
        Context c = new InitialContext();
        usersFacade = (UsersFacadeLocal)c.lookup("ejb/UsersFacade");
        //загрузка из базы списка юзверей
        List<Users> result = usersFacade.findAll();
        for (Users users : result) {
            listUsers.add(new UserData(users.getId().toString(), users.getLogin()));
        }
    }

PM MAIL   Вверх
VMA
Дата 17.3.2008, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.3.2008
Где: Самара

Репутация: нет
Всего: нет



Цитата(mbasil @  15.3.2008,  11:36 Найти цитируемый пост)

Context c = new InitialContext();
usersFacade = (UsersFacadeLocal)c.lookup("ejb/UsersFacade");


вылетает javax.naming.NameNotFoundException: UsersFacade not found

делал
Код

@Stateless(name="UsersFacade",mappedName="ejb/UsersFacade")
public class UsersFacade implements UsersFacadeLocal {
...

получил javax.naming.NameNotFoundException: UsersFacade not found

потом 
Код

@Local(UsersFacadeLocal.class)
public interface UsersFacadeLocal {
...
}


Код

public class UserRightsBean {
...
    public UserRightsBean() {
        Context c = new InitialContext();
        usersFacade = (UsersFacadeLocal)c.lookup(UsersFacadeLocal.class.getName());
    }
...
}

все тоже самое javax.naming.NameNotFoundException

PM MAIL ICQ   Вверх
mbasil
Дата 17.3.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



То есть сеансовый компонент в JNDI не находится и причина непонятна.
Можно попробовать в дескрипторе развертывания описать его явно.

PM MAIL   Вверх
VMA
Дата 17.3.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.3.2008
Где: Самара

Репутация: нет
Всего: нет



добавил в web.xml
Код

    <ejb-local-ref>
        <ejb-ref-name>UsersFaced</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <local-home/>
        <local>UsersFacedLocal</local>
        <ejb-link>com.strategiasoft.DataBase.Users</ejb-link>
    </ejb-local-ref>


в конструкторе пытаюсь выцепить 
Код

    usersFacade = (UsersFacadeLocal) ctx.lookup("UsersFacade");

javax.naming.NameNotFoundException: UsersFacade not found

Код

    Context env = (Context) ctx.lookup("java:comp/env");
    usersFacade = (UsersFacadeLocal) env.lookup("UsersFacade");

и все равно 
javax.naming.NameNotFoundException: No object bound to name java:comp/env/UsersFacade




PM MAIL ICQ   Вверх
mbasil
Дата 17.3.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



Загадка. Вы пользуетесь NetBeans?
GlassFishV2 это ведь изобретение SUN.
Можно попробовать состряпать NetBeans'ом простейшее приложение без всякого Hibernate и попробовать развернуть на GlassFish. Возможно дело в том конфигурационном файле, специфическом для сервера, который содержит описание приложения. NetBeans такой файл создает автоматически.
PM MAIL   Вверх
VMA
Дата 19.3.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.3.2008
Где: Самара

Репутация: нет
Всего: нет



Да. Использую Нетбинс 6.0
сменил Hibernate на OpenJPA, ничего не поменялось, да думаю и не в нем дело. 
проблема в том, что просматривая содержимое InitialContext
Код

Context env = (Context) ctx.lookup("java:comp/env");
en = env.list("");
while (en.hasMoreElements()) {
     Object o = en.nextElement();
     if (o != null) {
           System.out.println(o.toString());
     }
}

там даже и не пахнет ссылками на какие-либо сессион бины.
получается в конструкторе 
Код

    @EJB
    private UsersFacadeLocal usersFacade;

usersFacade равен null и в InitialContext ссылки на него нет... 
вне конструктора, в методе этого класса (убрав всю реализацию из конструктора), usersFacade не равен null, но в InitialContext опять же ничего нет

----------------------------------------------------------------------------------------------------------------------------

перелопатил несколько примеров, которые нормально работали..... где и классы и дескриптор развертывания были описан так же 
===web.xml===
Код

    <ejb-local-ref>
        <ejb-ref-name>UsersFacadeLocal</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <local>com.strategiasoft.DataBase.Users.UsersFacedLocal</local>
        <ejb-link>UsersFacade</ejb-link>
    </ejb-local-ref>


Код

    @Stateless
    public class UsersFacade implements UsersFacadeLocal {
        .....
    }


только в моем случае при деплое проекта вылетает ошибка:
Код

CORE5022: All ejb(s) of [WebAdminEnterprise] were unloaded successfully!
Exception occured in J2EEC Phasejava.lang.RuntimeException: Warning : Unable to determine local  business vs. remote business designation for  EJB 3.0 ref Unresolved Ejb-Ref UsersFacadeLocal@jndi: @[email protected]@Session@UsersFacade
com.sun.enterprise.deployment.backend.IASDeploymentException: Error loading deployment descriptors for module [WebAdminEnterprise] -- Warning : Unable to determine local  business vs. remote business designation for  EJB 3.0 ref Unresolved Ejb-Ref UsersFacadeLocal@jndi: @[email protected]@Session@UsersFacade
        at com.sun.enterprise.deployment.backend.Deployer.loadDescriptors(Deployer.java:390)
        at com.sun.enterprise.deployment.backend.AppDeployerBase.loadDescriptors(AppDeployerBase.java:358)
        at com.sun.enterprise.deployment.backend.AppDeployer.deploy(AppDeployer.java:226)
        at com.sun.enterprise.deployment.backend.AppDeployer.doRequestFinish(AppDeployer.java:148)
        at com.sun.enterprise.deployment.phasing.J2EECPhase.runPhase(J2EECPhase.java:191)
        at com.sun.enterprise.deployment.phasing.DeploymentPhase.executePhase(DeploymentPhase.java:108)
        at com.sun.enterprise.deployment.phasing.PEDeploymentService.executePhases(PEDeploymentService.java:919)
        at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:279)
        at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:788)
        at com.sun.enterprise.management.deploy.DeployThread.deploy(DeployThread.java:187)
        at com.sun.enterprise.management.deploy.DeployThread.run(DeployThread.java:223)
Caused by: java.lang.RuntimeException: Warning : Unable to determine local  business vs. remote business designation for  EJB 3.0 ref Unresolved Ejb-Ref UsersFacadeLocal@jndi: @[email protected]@Session@UsersFacade
        at com.sun.enterprise.deployment.util.EjbBundleValidator.accept(EjbBundleValidator.java:583)
        at com.sun.enterprise.deployment.WebBundleDescriptor.visit(WebBundleDescriptor.java:1406)
        at com.sun.enterprise.deployment.Application.visit(Application.java:1767)
        at com.sun.enterprise.deployment.archivist.ApplicationArchivist.validate(ApplicationArchivist.java:470)
        at com.sun.enterprise.deployment.archivist.ApplicationArchivist.openArchive(ApplicationArchivist.java:790)
        at com.sun.enterprise.deployment.archivist.ApplicationArchivist.openArchive(ApplicationArchivist.java:744)
        at com.sun.enterprise.deployment.backend.Deployer.loadDescriptors(Deployer.java:349)
        ... 10 more




Это сообщение отредактировал(а) VMA - 19.3.2008, 10:27
PM MAIL ICQ   Вверх
infestator
Дата 20.10.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.10.2008

Репутация: нет
Всего: нет



моя проблема немного не подходит под заголовок, но, по-моему, в тему содержания.
суть в том, что сначала у меня тоже был NamingException (это когда в бинах для jsf пытался делать di бинов ejb). но потом я решил, что всё это фигня и написал простейшее приложение...
значит так, есть два бина с локальными интерфейсами:
Bean1 interface:
Код
package test;

import javax.ejb.Local;

@Local
public interface Bean1Local {
    public void test();
}

Bean1 implementation:
Код
package test;

import javax.ejb.Stateless;

@Stateless
public class Bean1Bean implements Bean1Local {

    public void test() {
        System.out.println("\n\n\n!!!\n\n\n");
    }
    
}


Bean2 interface:
Код
package test;

import javax.ejb.Local;

@Local
public interface Bean2Local {
    public void test();
}

Bean1 implementation:
Код
package test;

import javax.ejb.EJB;
import javax.ejb.Stateless;

@Stateless
public class Bean2Bean implements Bean2Local {

    @EJB
    Bean1Local bl;
    
    public void test() {
        bl.test();
    }
    
}

вроде бы всё замечательно и мой ежб модуль компилируется и деплоится в гласфиш.

но всё становится значительно хуже, когда я создаю веб-приложение, в котором написано что-то типа:
faces-config.xml
Код
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="1.2" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">

    <managed-bean>
        <managed-bean-name>bean</managed-bean-name>
        <managed-bean-class>test.Bean2Bean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

</faces-config>

а на веб страничке (не буду её выкладывать, она на ричфэйсах и это не в тему, по-моему, будет) единственная кнопка, по нажатию которой вызывается тот самый метод Bean2Bean.test. и как оказалось, пока у меня в сервер приложений (кстати, гласфиш2) задеплоин test.Bean2Bean со строчками, в которых инжектится Bean1Local, моё веб приложение отказывается деплоится, выдавая что-то такое:
Код
deployment started : 0%
Deploying application in domain failed; Error loading deployment descriptors for module [test-war] -- Cannot resolve reference Unresolved Ejb-Ref test.Bean2Bean/bl@jndi: @[email protected]@Session@null
Deployment error:
The module has not been deployed.
See the server log for details.
        at org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment.deploy(Deployment.java:166)
        at org.netbeans.modules.j2ee.ant.Deploy.execute(Deploy.java:104)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
        at sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:357)
        at org.apache.tools.ant.Target.performTasks(Target.java:385)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
        at org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:277)
        at org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:460)
        at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:151)
Caused by: The module has not been deployed.
        at org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment.deploy(Deployment.java:160)
        ... 16 more

когда я убираю (коментирую строчки) с dependency injection в test.Bean2Bean
Код
package test;

import javax.ejb.EJB;
import javax.ejb.Stateless;

@Stateless
public class Bean2Bean implements Bean2Local {

//    @EJB
//    Bean1Local bl;
    
    public void test() {
//        bl.test();
    }
    
}

то всё работает. при этом, даже если в faces-config.xml я скажу использовать test.Bean1Bean (там используется test.Bean2Bean), то оно не будет работать до тех пор, пока в test.Bean2Bean есть dependency injection.

деплоймент дескрипторы я решил даже не трогать, т.к. в ежб3 они должны быть не нужны.
PM MAIL   Вверх
infestator
Дата 20.10.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.10.2008

Репутация: нет
Всего: нет



оказалось, что я не умею нормально деплоить. научился. теперь у меня та же ошибка, что и в этом топике:
Код
Caused by: java.lang.NullPointerException
        at test.Bean2Bean.test(Bean2Bean.java:22)
        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.el.parser.AstValue.invoke(AstValue.java:187)
        at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
        ... 48 more

собственно, есть какое-нить решение?

Добавлено через 11 минут и 48 секунд
чорт, чо-то я невнимательный сегодня.
автору трэда (если вообще ещё актуально) и тем, кто с этим будет сталкиваться:
в конструкторе все инжектируемые переменные будут нулами. используйте @PostContruct аннотированные методы, которые вызываются сразу после создания. контейнер не может делать инъекцию в несозданный объект, потому там ничего и недоступно.

p.s. сорри, нафлудил; но у меня проблема не в конструкторе, а в методе, поэтому актуально)
PM MAIL   Вверх
infestator
Дата 20.10.2008, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.10.2008

Репутация: нет
Всего: нет



чо-то сделал, всё заработало. странная эта штука жава ее...
PM MAIL   Вверх
alexadr
Дата 21.10.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

Репутация: нет
Всего: 4



Цитата(VMA @  14.3.2008,  10:39 Найти цитируемый пост)

Код

public class UserRightsBean {
    @EJB
    private UsersFacadeLocal usersFacade;
    private Collection<String> listUsers = new ArrayList<String>();
    //конструктор
    public UserRightsBean() {
        listUsers.clear();
        //загрузка из базы списка юзверей
        List<Users> result = usersFacade.findAll();
        for (Users users : result) {
            listUsers.add(new UserData(users.getId().toString(), users.getLogin()));
        }
    }
}



Сам не пробывал, но насколько мне известно, в переменная аннотированная как EJB будет заполнена после того как будет отработан конструктор класса UserRightsBean. А вот когда этот конструктор отработает, то контейнер у созданного объекта проинициализирует все что нужно. Т.е. скорее всего при вызове какого нить метода UserRightsBean переменная usersFacade будет не нулевой.



Это сообщение отредактировал(а) alexadr - 21.10.2008, 14:52
PM MAIL   Вверх
Asal
Дата 23.10.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 26.12.2006
Где: Минск

Репутация: 4
Всего: 7



Цитата(mbasil @  15.3.2008,  11:36 Найти цитируемый пост)
Похоже, что впрыскивания ресурса не происходит.Попробуйте прямым поиском в JNDI

есть теория, что надо попробывать другое имя. 
Иногда GlassFish вместо полного имени java:comp/env/MyName использует просто MyName и искать надо по нему


--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1041 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.