当前位置: 首页 > 知识库问答 >
问题:

WAR中部署的本地EJB的WildFly JNDI查找

卜盛
2023-03-14

我使用的是WildFly 8.1.0最终版本。

我的应用程序是一个部署在WAR中的JavaEE web应用程序(没有EJB模块.ear)。

我想使用JNDI以编程方式调用带有他的名字的本地EJB。

EJB只是用@无状态注释(没有本地或远程接口)

我尝试以下功能:

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发生战争的本地EJB示例,我也不知道该怎么做,我不经常使用JNDI。。。

我在用@Named(value=“EjbClassName”)注释EJB周围找到了一个工作,并使用JSF调用它们。

FacesContext context = FacesContext.getCurrentInstance() ;
return context.getApplication().evaluateExpressionGet(context, "#{"+cl.getSimpleName()+"Service}", CrudService.class) ;

它在工作,

但是我不喜欢使用JSF,因为它与视图层无关。

共有2个答案

郜光明
2023-03-14

mobile给出了一个简短的回答:使用@LocalBean获得bean的无接口视图。将其添加到无状态会话bean中,您应该可以在服务器的jndi视图中找到它。

通正平
2023-03-14

谢谢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

 类似资料:
  • 我有一个ear,它包含2个war文件,每个war都包含无状态ejb和rest类。接口位于commons中。jar文件。耳朵结构如下所示: 我试图使用无状态-ejb-2中的无状态-ejb-1和注释,但我在部署期间遇到了错误。当我在stateless-EJB-2中使用@EJB时,就部署了ear,但在调用jersey-rest-2时,我遇到了一个远程查找错误。 这是我的方法调用链: 泽西-rest-1

  • 在我的世界里,有两只耳朵。第一个EAR查找打包在第二个EAR中的ejb。我的问题是,既然两个耳朵在同一个WAS中,我们还需要提供属性或者服务器会自动定位EJB吗?

  • 当我尝试部署一个war(Apache airavata-registry . war)时,我得到如下所示的错误。能是什么原因呢? 2013年11月14日下午7:41:19 org . Apache . catalina . core . application context日志信息:HTMLManager: list:列出虚拟主机“localhost”的上下文2013年11月14日下午7:41:

  • 我已经在archlinux上安装了tomcat,我尝试了tomcat7和Tomcat8。根据包括官方文档在内的多个来源,部署WAR文件就像将其放入webapps文件夹(在我的示例中是/var/lib/tomcat7/webapps)一样容易。WAR文件被分解。但我不知道如何访问我的web应用程序。在localhost:8080上有一个tomcat网页。我还尝试了localhost:8080/nam

  • 在prop service中的必需类中,但serviceCaller在这里显示为null。在这个问题上搜索发现,我们只能在容器管理的类中使用@EJB,而不能在简单的java类中使用。 我已经尝试了一切,但注意似乎是有效的。所以请帮我解决这个问题。

  • 我在eclipse IDE中有一个ant项目。Ant build在dist文件夹中创建一个war。我将war复制到Tomcat webapps文件夹并成功部署它。现在,我将Tomcat添加到eclipse中,并尝试在这里部署war,它会忽略war文件。它没有给出任何例外bu也没有做任何有用的事情。下面是完整的Tomcat日志- 它是一个动态的Web模块项目。在Eclipse中设置Tomcat时是否