WildFly JNDI 查找部署在 WAR 中的本地 EJB [英] WildFly JNDI lookup for local EJB deployed in a WAR
问题描述
我使用的是 WildFly 8.1.0 最终版.
I'm using WildFly 8.1.0 Final release.
我的应用程序是部署在 WAR 中的 JavaEE Web 应用程序(没有 EJB 模块 .ear).
My application is a JavaEE web app deployed in a WAR (there is no EJB module .ear).
我想使用 JNDI 以编程方式调用带有他的名字的本地 EJB.
I want to programmatically invoke local EJB with his name using JNDI.
EJB 只是用@Stateless 注释(没有本地或远程接口)
The EJB are just annotated with @Stateless (there is no Local or Remote interfaces)
我尝试以下功能:
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)
but it doesn't work (obviusly it's for remote EJB)
但是我在与 WildFly 的 WAR 中找不到任何本地 EJB 示例,我不知道该怎么做,我不经常使用 JNDI...
But I don't find any example for local EJB in a WAR with WildFly and I have no idea how to do, I don't use JNDI often...
我发现了一个使用 @Named(value="EjbClassName") 注释 EJB 并使用 JSF 调用它们的工作.
I found a work arround annotating EJB with @Named(value="EjbClassName") and invoke them using JSF.
FacesContext context = FacesContext.getCurrentInstance() ;
return context.getApplication().evaluateExpressionGet(context, "#{"+cl.getSimpleName()+"Service}", CrudService.class) ;
它正在工作,
但我不想使用 JSF,因为它与视图层无关.
but I'd prefer not using JSF as it's not related to the view layer.
推荐答案
谢谢 Yamada,JNDI 名称在启动时出现在服务器日志中
Thank you Yamada the JNDI names appear in the server logs at startup
此解决方案有效:
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
without annotate EJB with @LocalBean
这篇关于WildFly JNDI 查找部署在 WAR 中的本地 EJB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!