我正在使用WildFly 8.1.0最终版本。
我的应用程序是部署在WAR中的JavaEE Web应用程序(没有EJB模块.ear)。
我想使用JNDI以编程方式使用他的名字调用本地EJB。
EJB只是使用@Stateless注释(没有本地或远程接口)
我尝试以下功能:
private <E extends DomainObject> CrudService<E> lookUp(Class<E> cl) {
try {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
// The app name is the application name of the deployed EJBs. This is typically the ear name
// without the .ear suffix. However, the application name could be overridden in the application.xml of the
// EJB deployment on the server.
// Since we haven't deployed the application as a .ear, the app name for us will be an empty string
final String appName = "";
// This is the module name of the deployed EJBs on the server. This is typically the jar name of the
// EJB deployment, without the .jar suffix, but can be overridden via the ejb-jar.xml
// In this example, we have deployed the EJBs in a jboss-as-ejb-remote-app.jar, so the module name is
// jboss-as-ejb-remote-app
final String moduleName = "jboss-as-ejb-remote-app";
// AS7 allows each deployment to have an (optional) distinct name. We haven't specified a distinct name for
// our EJB deployment, so this is an empty string
final String distinctName = "";
// The EJB name which by default is the simple class name of the bean implementation class
final String serviceName = cl.getSimpleName() + "Service";
// let's do the lookup
return (CrudService<E>) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + serviceName );
//return (CrudService<E>) context.lookup(serviceName);
} catch (NamingException e) {
log.error("NamingException {}",e) ;
throw new RuntimeException(e) ;
}
}
但它不起作用(显然它是远程EJB的)
但是我没有在WildFly的WAR中找到本地EJB的任何示例,我不知道该怎么做,我不经常使用JNDI ......
我找到了一个用@Named注释EJB的工作(value =&#34; EjbClassName&#34;)并使用JSF调用它们。
FacesContext context = FacesContext.getCurrentInstance() ;
return context.getApplication().evaluateExpressionGet(context, "#{"+cl.getSimpleName()+"Service}", CrudService.class) ;
它正在工作,
但我不想使用JSF,因为它与视图层无关。
答案 0 :(得分:3)
感谢Yamada,JNDI名称出现在启动时的服务器日志中
此解决方案有效:
private <E extends DomainObject> CrudService<E> lookUp(@NonNull Class<E> entityClass) throws NamingException {
try {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
return (CrudService<E>) context.lookup("java:module/"+entityClass.getSimpleName()+"Service");
} catch (NamingException e) {
log.error("lookUp({}) throws NamingException {}",entityClass.getSimpleName(),e.getMessage()) ;
throw e ;
}
}
没有使用@LocalBean注释EJB
答案 1 :(得分:0)
来自手机的简短回答: 使用@LocalBean获取bean的无接口视图。将此添加到无状态会话Bean,您应该在服务器的jndi视图中找到它。