WildFly JNDI 查找部署在 WAR 中的本地 EJB [英] WildFly JNDI lookup for local EJB deployed in a WAR

查看:32
本文介绍了WildFly JNDI 查找部署在 WAR 中的本地 EJB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆