Предположим, у вас есть следующий удаленный интерфейс:
@Remote
public interface HelloBeanRemote {
public String sayHello();
}
И сессионный компонент, реализующий его:
@Stateless
public class HelloBean implements HelloBeanRemote {
...
}
И что этот EJB правильно упакован и развернут на JBoss.
На стороне клиента создайте jndi.properties
со следующим содержимым и поместите его в classpath:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
Затем используйте следующий код для вызова вашего EJB:
Context context;
try {
context = new InitialContext();
HelloBeanRemote beanRemote = (HelloBeanRemote)context.lookup("HelloBean/remote");
beanRemote.test();
} catch (NamingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
В качестве альтернативы, если вы не хотите предоставлять файл jndi.properties
, вы можете явно настроить среду JNDI в коде и создать контекст следующим образом:
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);
Но я бы порекомендовал использовать jndi.properties
для переносимости.