【问题标题】:javax.naming.NameNotFoundException EJB HelloWorld on WildFlyWildFly 上的 javax.naming.NameNotFoundException EJB HelloWorld
【发布时间】:2019-01-04 14:46:21
【问题描述】:

我是 EJB 3.1 的初学者,正在尝试运行我的第一个 Hello World 程序并得到 NameNotFoundException。

Exception in thread "main" javax.naming.NameNotFoundException: WFNAM00004: Name "global/HelloWorld/HelloWorldBean!api.HelloWorldRemote" is not found
at org.wildfly.naming.client.util.NamingUtils$1.lookupNative(NamingUtils.java:95)
at org.wildfly.naming.client.AbstractContext.lookup(AbstractContext.java:84)
at org.wildfly.naming.client.WildFlyRootContext.lookup(WildFlyRootContext.java:150)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at driver.HelloWorld.main(HelloWorld.java:27)

这是我的课程

本地接口:

@Local
 public interface HelloWorldLocal {
public void getHello();
 }

远程接口:

@Remote
public interface HelloWorldRemote extends HelloWorldLocal {

 }

豆类:

@Stateless(name="HelloWroldBean")
public class HelloWorldBean implements HelloWorldLocal, HelloWorldRemote{

@Override
public void getHello() {
    System.out.println("Hello Cheppura");
}

  }

客户:

public class HelloWorld {

public static void main(String[] args) throws NamingException {
    final Hashtable<String, String> jndiProperties = new Hashtable<>();
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY,         
            "org.wildfly.naming.client.WildFlyInitialContextFactory");
    Context con = new InitialContext(jndiProperties);

    final String appName = "";
    final String moduleName = "HelloWorld";
    final String beanName = HelloWorldBean.class.getSimpleName();
    final String viewClassName = HelloWorldRemote.class.getName();

    Object ob = con.lookup("java:global" + appName + "/" + moduleName  + "/" + beanName + "!" + viewClassName);

    HelloWorldRemote hw = (HelloWorldRemote) PortableRemoteObject.narrow(ob, HelloWorldRemote.class);

    hw.getHello();
}

}

任何人都可以就此提出建议吗? 提前致谢

【问题讨论】:

  • 我从未使用过 WildFly,但看起来您实际上并没有在任何地方注册 bean。 con.lookup 寻找已注册的 bean,但没有告诉 WildFly 创建 HelloWorldBean 的实例。
  • 从本地扩展远程接口的原因是什么?
  • 您在编写的无状态注释中的实现有错字:HelloWroldBean。请更正并重试。 ??????
  • @Pulszar 我想在这种情况下没有任何意义。
  • 您的部署单元是什么 - JAR 或 EAR?

标签: java ejb wildfly


【解决方案1】:

您违反了 JEE 规范,因为 EJB 接口中没有继承。

您的Remote 接口扩展了Local 之一,但这种方法违反了规范。我认为无论运行时环境如何,这样的 EAR 都不会正确部署。

如果您想以这种方式编写更少的代码,则使用public void getHello(); 方法创建第三个接口,并在LocalRemote 接口中扩展它。

public interface Secondary {
    public void getHello();
}

@Remote
public interface HelloWorldRemote extends Secondary {
 }

@Local
 public interface HelloWorldLocal extends Secondary{
 }

【讨论】:

  • 为什么要延长违规行为?
  • @BrunoJCM 这种方法在大多数应用程序服务器上都可以完美运行,但我认为它会使代码复杂化,使其变得混乱。 EJB 3.0 规范还说:“同一个业务接口不能同时是 bean 的本地和远程业务接口。[4]”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2014-08-22
  • 1970-01-01
  • 2023-03-29
  • 2015-12-05
  • 2017-10-31
  • 1970-01-01
相关资源
最近更新 更多