【问题标题】:Getting NameNotFoundException while running client program of EJB运行 EJB 的客户端程序时出现 NameNotFoundException
【发布时间】:2016-04-09 17:15:34
【问题描述】:

我是 EJB 新手。

我正在努力学习开发无状态 bean。我创建了 jar 文件并将其部署在 Weblogic 服务器上,然后我执行了客户端代码。我已经为 api.jarweblogic.jar 设置了类路径。但是在运行客户端代码时出现以下错误:

C:\Users\Asad\Desktop\EJB>java EjbClient1
Exception in thread "main" javax.naming.NameNotFoundException: Unable to resolve 'myAdder#Adder'. Resolved '' [Root exception is javax.naming.NameNotFoundException: Unable to resolve 'myAdder#Adder'. Resolved '']; remaining name 'myAdder#Adder'
        at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1224)
        at weblogic.jndi.internal.BasicNamingNode.lookupHere(BasicNamingNode.java:273)
        at weblogic.jndi.internal.ServerNamingNode.lookupHere(ServerNamingNode.java:217)
        at weblogic.jndi.internal.BasicNamingNode.lookupIgnorePartition(BasicNamingNode.java:1503)
        at weblogic.jndi.internal.PartitionHandler.lookupSharable(PartitionHandler.java:88)
        at weblogic.jndi.internal.ServerNamingNode.lookup(ServerNamingNode.java:584)
        at weblogic.jndi.internal.RootNamingNode.lookup(RootNamingNode.java:81)
        at weblogic.jndi.internal.RootNamingNode_WLSkel.invoke(Unknown Source)
        at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:645)
        at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:248)
        at weblogic.rmi.internal.BasicServerRef$2.run(BasicServerRef.java:534)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:368)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:163)
        at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:531)
        at weblogic.rmi.internal.wls.WLSExecuteRequest.run(WLSExecuteRequest.java:137)
        at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348)
        at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333)
        at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:54)
        at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41)
        at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:617)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:397)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:346)
Caused by: javax.naming.NameNotFoundException: Unable to resolve 'myAdder#Adder'. Resolved ''
        at weblogic.utils.StackTraceDisabled.unknownMethod()

以下是代码。

客户端EjbClient1.java:

import javax.naming.*;
import java.util.*;
import javax.naming.Context;  
import javax.naming.InitialContext;  

public class EjbClient1 {
    public static void main(String s[])throws Exception {
        Properties parm=new Properties();
        parm.setProperty("java.naming.factory.initial","weblogic.jndi.WLInitialContextFactory");
        parm.setProperty("java.naming.provider.url","t3://localhost:7001");
        parm.setProperty("java.naming.security.principal","weblogic");
        parm.setProperty("java.naming.security.credentials","asad9711");
        // parm.setProperty("java.naming.security.credentials","weblogic12");

        InitialContext ctx=new InitialContext(parm);
        Adder stub=(Adder)ctx.lookup("myAdder#Adder");

        int c=stub.add(10,20);
        System.out.println(c);

    }
}

Bean 类 AdderBean.java:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Stateless;

@Stateless(mappedName="myAdder")
class AdderBean implements Adder {
    @PostConstruct  
    public void init()
    {
        System.out.println("post create");

    }
    @PreDestroy
    public void destroy()
    {
        System.out.println("destroy");
    }
    public int add(int x,int y)
    {
        return x+y;
    }
}

远程接口Adder.java:

import javax.ejb.Remote;

@Remote
public interface Adder
{
     int add(int x,int y);
}

【问题讨论】:

  • 你的Adder接口的全称是什么,即接口的包名是什么?
  • 所有三个.java files (Adder.java,AdderBean.java,EjbClient1.java) 都存在于同一个文件夹中。
  • 你能检查一下,你的 jar 里有你的类文件吗?
  • 你取得了什么进展?
  • 我制作了Adder.java, AdderBean.java,ejb-jar.xml 的jar文件。它成功部署在weblogic服务器上,但是当我执行客户端(EjbClient1)时,它给出了错误。

标签: jakarta-ee ejb


【解决方案1】:

您的代码在更改了一些内容后对我有用。

我将会话 bean 的访问修饰符更改为 public

检查您的 jar 文件是否包含类文件。它必须包含您的 Interface 和 SessionBean。

使用命令行

1)编译项目

Project_DIR>javac -d bin -sourcepath src -cp lib\.m2\repo
sitory\javax\javaee-api\6.0\javaee-api-6.0.jar;C:\Oracle\Middleware\wlserver_10.
3\server\lib\weblogic.jar src\main\java\Adder.java src\main\java\AdderBean.java
src\main\java\EjbClient1.java

2)构建jar

Project_DIR\bin>jar cf myejbapp.jar Adder.class AdderBean
.class EjbClient1.class

3)将myejbapp.jar部署到weblogic并运行EJBClient1

【讨论】:

    【解决方案2】:

    尝试使用完全限定名进行查找 以 (mappedName#packageName.interfaceName) 的形式,即使它们在同一个包中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2010-12-09
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      相关资源
      最近更新 更多