Прежде всего, ваш xml-файл указывает, что вы используете EJB3 (что на самом деле является единственной версией, даже заслуживающей рассмотрения), но ваш бин - это EJB2-бин.
Если на вашем сервере действительно работает EJB3, удалите файл XML и удалите ненужные реализации EJB home и компонентов. Добавьте аннотацию @Stateless
и удаленный интерфейс. Убедитесь, что это выглядит примерно так:
@Remote
public interface SinaRemote {
String getHello();
}
@Stateless
public class SinaBean implements SinaRemote {
public String getHello() {
return "hello";
}
}
Затем исправьте свои свойства JNDI. Следующее неверно:
p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.namingrg.jnp.interfaces");
должно быть:
p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
(варианты, которые используют люди, здесь почти бесконечны, и в любом случае это всегда работает, но для уверенности используйте правильный вариант)
Более того, и, скорее всего, главный виновник, вы используете ejb-name
как если бы это было глобальное имя JNDI, но это не так. ejb-name
- это несколько запутанное логическое имя, которое используется в качестве дополнительного вида спецификатора при обращении к конкретному бину при внедрении или создании ejb-ref.
В вашем случае вы устанавливаете его так же, как и неквалифицированное имя компонента, которое уже используется по умолчанию. Поскольку существует SinaBean
, я предполагаю, что вы не развертываете через EAR, а развернете автономный EJB-файл, верно?
Если вы используете JBoss AS 6 (EJB3.1), вы можете использовать глобальные переносимые имена JNDI , в противном случае можно использовать старое специфичное для JBoss наименование JNDI: [ear name]/[simple bean name]/remote
. Обратите внимание, что [простое имя bean-компонента] не является ejb-именем, но опять же в вашем случае они оказались одинаковыми. Поскольку [ear name]/
удаляется при развертывании только файла EJB, это объясняет исключение, которое вы получаете: SinaBean
- это каталог ( context в терминах JNDI), который может содержать реальные записи local
, remote
и no-interface
. То, что вы делаете, пытается преобразовать этот промежуточный узел каталога в прокси к вашему бину, что, конечно, не работает.
В любом случае, наконец, удалите использование PortableRemoteObject
, это больше не нужно . Код клиента будет выглядеть следующим образом:
Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
properties.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
properties.setProperty(Context.PROVIDER_URL, "localhost:1099");
context = new InitialContext(properties);
SinaRemote sina = (SinaRemote) context.lookup("SinaBean/remote");