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

Wildfly 8上简单EJB项目中的NofiralContextException

张博涛
2023-03-14

我正在尝试为一个简单的EJB项目编写一个客户端,我已经在本地部署了在Eclipse中运行的Wildfly 8。

我的界面:

package com.jwt.ejb.business;

import javax.ejb.Remote;

@Remote
public interface Hello {

    public String sayHello();
}

我的实施:

package com.jwt.ejb.businesslogic;

import javax.ejb.Stateless;

import com.jwt.ejb.business.Hello;

@Stateless
public class HelloBean implements Hello {

    public HelloBean() { 
    }

    public String sayHello() { 
        return "Hello Boss Welcome to EJB";
    } 
}

我的客户:

package com.jwt.ejb.test;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.jwt.ejb.business.Hello;
import com.jwt.ejb.businesslogic.HelloBean;

public class Client {
    public static void main(String[] args) {
        Hello bean = doLookup();
        if (bean != null)
            System.out.println(bean.sayHello());
    }

    private static Hello doLookup() {
        Context context = null;
        Hello bean = null;
        try {
            final Hashtable jndiProperties = new Hashtable();
            jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
            context = new InitialContext(jndiProperties);
            bean = (Hello) context.lookup(getLookupString());

        } catch (NamingException e) {
            e.printStackTrace();
        }
        return bean;
    }

    private static String getLookupString() throws NamingException {
        final String appName = "";
        final String moduleName = "EJBTest";
        final String distinctName = "";
        final String beanName = HelloBean.class.getSimpleName();
        final String viewClassName = Hello.class.getName();
        return "ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName;
    }
}

当我运行它时,我得到这个异常:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
    at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.lookup(Unknown Source)
    at com.jwt.ejb.test.Client.doLookup(Client.java:26)
    at com.jwt.ejb.test.Client.main(Client.java:15)
Exception in thread "main" java.lang.NullPointerException
    at com.jwt.ejb.test.Client.main(Client.java:16)

官方文件也是这样:https://docs.jboss.org/author/display/AS71/EJB使用JNDI从远程客户端调用

问题出在哪里?

我在帖子中谈到了boss ejb客户端。属性,但我不知道该放什么。据我所知,我可以拥有这个属性文件,也可以像我那样通过编程方式声明属性。

共有1个答案

燕宏胜
2023-03-14

除了使用Wildfly 8并引用JBoss作为7.1的文档之外,您还缺少JNDI属性上的InitialContextFactory。

Wildfly通过JNDI对EJB调用的留档在这里。因此,您应该执行以下操作:

void doBeanLookup() {
    Properties jndiProperties = new Properties();
    jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
    jndiProperties.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");

    // This is an important property to set if you want to do EJB invocations via the remote-naming project
    jndiProps.put("jboss.naming.client.ejb.context", true);
    // create a context passing these properties
    Context ctx = new InitialContext(jndiProps);

    // lookup the bean Hello
    Hello bean = (Hello) ctx.lookup(getLookupString());
}

在您的pom.xml中,您应该具有以下内容:

<dependency>
    <groupId>org.wildfly</groupId>
    <artifactId>wildfly-ejb-client-bom</artifactId>
    <version>8.0.0.Final</version>
    <type>pom</type>
</dependency>

如果要使用http远程处理协议,请在方法上删除ejb并显示

超文本传输协议-远程客户端假设远程查找中的JNDI名称相对于java: jboss/导出命名空间,绝对JNDI名称的查找将失败。

更多信息可以在Wildfly 8 Remote JNDI参考更新草案中找到。

 类似资料:
  • 我试图建立一个简单的SpringMVC项目。 我创建了Web应用程序项目,然后添加了Spring和公共日志库。 还有这个网站。xml文件 这是HelloWebservlet。xml 然后我创建了java类(HelloContoller.java)com.tutorialspoint包 然后我在WEB-INF/JSP/hello中创建了JSP页面。jsp 我正在处理服务器glassfish,当我运行

  • 我创建了一个NetBeans企业应用程序,它由包装ejb(jar)项目和web(war)项目的ear组成。 我的web项目中有一个servlet,我想在其中使用ejb项目中的一个ejb。

  • 我目前正在将一些项目转换为maven,并且在战争开始时遇到了一些问题。因此,我刚刚创建了一个非常简单的ehcache maven项目,我得到了一个类加载器类型的问题。这是我的POM: Spring Config:http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring

  • 为了配置一个简单的JPA项目,我使用了Wildfly 8,数据源是在单机版中配置的。xml。 在Web项目中,我配置了持久性。像这样的xml文件 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 但是,当我添加br时。通用域名格式。卖应用程序。奥姆。通常,我在项目启动时出错,该错误表示存在hibernate问题org/hiber

  • 我正在开发一个电子商务应用程序。为此,我想为每个客户创建一个会话,以维护他们的购物车信息。 如果它是一个普通的JavaEE项目,我会使用并将所有购物车信息添加到该会话中。 我的问题是对于EJB项目,为上述目的创建会话的过程是什么?

  • 这是我的代码... build.sbt *hello.scala* 顺便说一下,我使用的是OSX Mountain Lion,sbt 0.13,Scala 2.10.3。