Salve pessoal,
Tenho um session bean dentro de um jar e essse jar dentro de um ear no JBoss 4.0.5.
Quero acessar esse bean a partir de um cliente remoto.
Já tentei fazer o lookup da seguinte maneira:
-
bean contendo:
@Stateless
public static final String JNDIname = ServiceProviderBean.class.getSimpleName() + “/remote”;
cliente fazendo lookup:
lookup(ServiceProviderBean.JDNIname);
-
bean contendo:
@Stateless
@RemoteBinding(jndiBinding=“br.com.xyz.services.provider.ServiceProviderBean”)
cliente fazendo lookup:
lookup(“ServiceProviderBean/remote”);
-
bean contendo:
@Stateless
@EJB(name=“sp”, beanInterface=ServiceProvider.class)
cliente fazendo lookup:
lookup(“java:/comp/env/sp”)
-
bean contendo:
@Stateless
cliente fazendo lookup:
lookup(“java:/comp/env/br.com.xyz.services.provider.ServiceProviderBean”);
e nada funcionou.
Só funcionou assim:
bean contendo:
@Stateless
cliente fazendo lookup:
lookup("//remote").
…porém, não quero usar esse lookup, para não ter que passar o nome do ear.
Como estou usando EJB3 e ele não necessita de ejb-jar.xml, o que está faltando para funcionar? Alguém poderia me dar um luz?
Agradeço desde já qualquer colaboração.
[]s,
Luiz
Boa tarde…
estou tendo o mesmo problema de só conseguir fazer o lookup no ejb3 utilizando lookup("//remote").
Alguem sabe como eu posso fazer isso sem utilizar o nome do ear.
Obrigado
tectuba
#43
Ai pessoal, vou colocar algumas coisas que usamos para acesso remoto de EJBS.
Fixture para acesso:
public class ServiceLocator {
private Context context;
public ServiceLocator(Context context) {
this.context = context;
}
public ServiceLocator(Server server) throws NamingException {
context = new InitialContext(JndiPropertiesBuilder.build(server));
}
/**
* Method responsible for fetching an instance of an EJB. Makes a lookup, if
* not found returns null
*
* @param ejb
* @return
*/
public <T> Object lookup(Class<T> ejb) {
try {
Object lookup = context.lookup(ejb.getSimpleName() + "-remote");
return lookup;
} catch (NamingException e) {
e.printStackTrace();
return null;
}
}
/**
* Method responsible for fetching an instance of a remote service from a
* server selected by the manufacturer.
*
* @param serviceRemoteBean
* @return
*/
public <T> Object getRemoteService(Class<T> serviceRemoteBean) {
return lookup(serviceRemoteBean);
}
}
public class JndiPropertiesBuilder {
private JndiPropertiesBuilder() {
// should not be instantiated.
}
public static Properties build(Server server) {
Properties properties = new Properties();
properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.provider.url", server.getJndiName());
properties.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
return properties;
}
}
public enum Server {
SELENIUM("http://URL_SERVER", "jnp://IP:1099");
private String url;
private String jndiName;
private Server(String url, String jndiName) {
this.url = url;
this.jndiName = jndiName;
}
public String getUrl(){
return this.url;
}
public String getJndiName(){
return this.jndiName;
}
}
O seu Bean remoto deve ser anotado da seguinte maneira:
@Stateless(mappedName = “ServiceBean-remote”)
O restante são as dependencias. Importante lembrar que esse exemplo é para Jboss 6x!
Abraço a todos.