Поиск ссылки на объект из JNDI приводит к ClassCastException - PullRequest
2 голосов
/ 29 января 2010

У меня проблемы с вызовом EJB3-компонента без сохранения состояния вне контейнера.

Код для получения ссылки на объект:

Context envCtx = (Context) context.lookup("ejb");
MyObject o = (MyObject) envCtx.lookup(MyObject);

Вторая строка приводит к исключению:

java.lang.ClassCastException: javax.naming.Reference

Я использую JBoss.org 5.1.0 GA.

На основании некоторых других сообщений я подозреваю, что это может быть связано с неправильной версией клиентских библиотек Тем не менее, я не уверен, какую библиотечную банку (и) я должен включить в банку? (Я получаю сообщение об ошибке, используя 5.0.4.GA jnpserver.)

1 Ответ

5 голосов
/ 29 января 2010

Для JBoss ваш код должен выглядеть примерно так:

Properties properties = new Properties();
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");
properties.put("java.naming.provider.url","localhost:1099");

Context context = new InitialContext(properties);
(EchoBeanRemote) c.lookup("EchoBean/remote");

Если вы предпочитаете, вы можете поместить параметры среды JNDI в файл jndi.properties (который должен быть в пути к классам):

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1099

И использовать не-arg InitialContext конструктор:

Context context = new InitialContext();
(EchoBeanRemote) c.lookup("EchoBean/remote");

Это, очевидно, более переносимо.

И в обоих случаях вам потребуется jbossall-client.jar на пути к классам на стороне клиента.

P.S .: Вы можете проверить Глобальное имя JNDI , на котором зарегистрирован ваш бин, в JNDI View веб-консоли JMX (если оно еще существует).

...