gpt4 book ai didi

java - ejb 查找因 NamingException 而失败

转载 作者:搜寻专家 更新时间:2023-10-30 21:14:20 26 4
gpt4 key购买 nike

我在 web.xml 中添加了以下内容:

<ejb-ref>
<ejb-ref-name>ejb/userManagerBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>gha.ywk.name.entry.ejb.usermanager.UserManagerHome</home>
<remote>what should go here??</remote>
</ejb-ref>

以下 java 代码给了我 NamingException:
public UserManager getUserManager () throws HUDException {
String ROLE_JNDI_NAME = "ejb/userManagerBean";
try {
Properties props = System.getProperties();
Context ctx = new InitialContext(props);
UserManagerHome userHome = (UserManagerHome) ctx.lookup(ROLE_JNDI_NAME);
UserManager userManager = userHome.create();
WASSSecurity user = userManager.getUserProfile("user101", null);
return userManager;
} catch (NamingException e) {
log.error("Error Occured while getting EJB UserManager" + e);
return null;
} catch (RemoteException ex) {
log.error("Error Occured while getting EJB UserManager" + ex);
return null;
} catch (CreateException ex) {
log.error("Error Occured while getting EJB UserManager" + ex);
return null;
}
}

代码在容器内部使用。我的意思是 .WAR 部署在服务器(Sun Application Server)上。

StackTrace(根据 jsight 的建议):
>Exception occurred in target VM: com.sun.enterprise.naming.java.javaURLContext.<init>(Ljava/util/Hashtable;Lcom/sun/enterprise/naming/NamingManagerImpl;)V 
java.lang.NoSuchMethodError: com.sun.enterprise.naming.java.javaURLContext.<init>(Ljava/util/Hashtable;Lcom/sun/enterprise/naming/NamingManagerImpl;)V
at com.sun.enterprise.naming.java.javaURLContextFactory.getObjectInstance(javaURLContextFactory.java:32)
at javax.naming.spi.NamingManager.getURLObject(NamingManager.java:584)
at javax.naming.spi.NamingManager.getURLContext(NamingManager.java:533)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:279)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at gov.hud.pih.eiv.web.EjbClient.EjbClient.getUserManager(EjbClient.java:34)

最佳答案

我想您想从 Sun Application Server 中的 Web 应用程序访问 EJB 应用程序(称为 EJB 模块),对吗?

好了,走吧。

当您将 EJB 部署到应用程序服务器中时,应用程序服务器会为其提供一个地址——称为全局 JNDI 地址——作为您访问它的一种方式(类似于您的地址)。它从一个应用程序服务器更改为另一个应用程序服务器。

在JBoss应用服务器中,可以在如下地址看到全局JNDI地址(启动后)

http://127.0.0.1:8080/jmx-console/HtmlAdaptor

在 Sun Application Server 中,如果要查看全局 JNDI 地址(启动后),请执行以下操作

在以下地址访问管理控制台
http://127.0.0.1:4848/asadmin

然后点击 JNDI 浏览

如果您的 EJB 未在那里注册,则说明有问题

EJB 有两种版本:EJB 2.1 和 EJB 3.0。那么区别是什么呢 ?

嗯,嗯,嗯……

让我们从 EJB 2.1 开始
  • 创建首页界面

  • 它定义了用于创建、销毁和查找本地或远程 EJB 对象的方法。它充当 EJB 对象的生命周期接口(interface)。所有本地接口(interface)都必须扩展标准接口(interface) javax.ejb.EJBHome - 如果您使用远程 ejb 对象 - 或 javax.ejb.EJBLocalHome - 如果您使用本地 EJB 对象。
    // a remote EJB object - extends javax.ejb.EJBHome
    // a local EJB object - extends javax.ejb.EJBLocalHome
    public interface MyBeanRemoteHome extends javax.ejb.EJBHome {

    MyBeanRemote create() throws javax.ejb.CreateException, java.rmi.RemoteException;

    }

    Application Server 将创建 Home 对象作为获取 EJB 对象的一种方式,仅此而已。

    请注意以下事项

    A session bean’s remote home interface MUST DEFINE ONE OR MORE create<METHOD> methods. A stateless session bean MUST DEFINE exactly one <METHOD> method with no arguments.



    ...

    throws clause MUST INCLUDE javax.ejb.CreateException



    ...

    If your Home interface extends javax.ejb.EJBHome, throws clauses MUST INCLUDE the java.rmi.RemoteException. If it extends javax.ejb.EJBLocalHome, MUST NOT INCLUDE the java.rmi.RemoteException.



    ...

    Each create method of a stateful session bean MUST BE NAMED create<METHOD>, and it must match one of the Init methods or ejbCreate<METHOD> methods defined in the session bean class. The matching ejbCreate<METHOD> method MUST HAVE THE SAME NUMBER AND TYPES OF ARGUMENTS. The create method for a stateless session bean MUST BE NAMED create but need not have a matching “ejbCreate” method.



    现在创建一个业务接口(interface),以便在我们的 EJB 对象中定义业务逻辑
    // a remote EJB object - extends javax.ejb.EJBObject
    // a local EJB object - extends javax.ejb.EJBLocalObject
    public interface MyBeanRemote extends javax.ejb.EJBObject {

    void doSomething() throws java.rmi.RemoteException;

    }

    现在注意以下几点

    If you are using a remote EJB object, remote interface methods MUST NOT EXPOSE local interface types or local home interface types.



    ...

    If your Home interface extends javax.ejb.EJBObject, throws clauses MUST INCLUDE the java.rmi.RemoteException. If it extends javax.ejb.EJBLocalObject, MUST NOT INCLUDE the java.rmi.RemoteException.



    现在我们的 EJB
    public class MyBean implements javax.ejb.SessionBean {

    // why create method ? Take a special look at EJB Home details (above)
    public void create() {
    System.out.println("create");
    }

    public void doSomething() throws java.rmi.RemoteException {
    // some code
    };

    }

    现在注意以下几点

    It MUST IMPLEMENTS javax.ejb.SessionBean. It defines four methods - not shown above: setSessionContext, ejbRemove, ejbPassivate, and ejbActivate.



    注意我们的 bean 不实现 由于 EJB 规范,我们的业务接口(interface)说:

    对于接口(interface)中定义的每个方法,都有 必须是匹配方法在 session bean 的类中。匹配方法必须具有:
  • 同名
  • 相同数量和类型的参数,以及相同的返回类型。
  • session匹配方法的throws子句中定义的所有异常
    bean 类必须在本地接口(interface)的方法的 throws 子句中定义。

  • 你必须根据
    <?xml version="1.0" encoding="UTF-8"?>
    <ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd" version="2.1">
    <enterprise-beans>
    <session>
    <ejb-name>HelloWorldEJB</ejb-name>
    <home>br.com.MyBeanRemoteHome</home>
    <remote>br.com.MyBeanRemote</remote>
    <local-home>br.com.MyBeanLocalHome</local-home>
    <local>br.com.MyBeanLocal</local>
    <ejb-class>br.com.MyBean</ejb-class>
    <session-type>Stateless</session-type>
    <transaction-type>Container</transaction-type>
    </session>
    </enterprise-beans>
    </ejb-jar>

    如果您没有从上面的部署描述符中删除本地 EJB 对象
    <local-home>br.com.MyBeanLocalHome</local-home>
    <local>br.com.MyBeanLocal</local>

    如果您没有从上面的部署描述符中删除远程 EJB 对象
    <home>br.com.MyBeanRemoteHome</home>
    <remote>br.com.MyBeanRemote</remote>

    并放入 META-INF 目录

    我们的 jar 文件将包含以下内容
    /META-INF/ejb-jar.xml
    br.com.MyBean.class
    br.com.MyBeanRemote.class
    br.com.MyBeanRemoteHome.class

    现在我们的 EJB 3.0
    // or @Local
    // You can not put @Remote and @Local at the same time
    @Remote
    public interface MyBean {

    void doSomething();

    }

    @Stateless
    public class MyBeanStateless implements MyBean {

    public void doSomething() {

    }

    }

    没有其他的,

    在 JBoss 中放入 jar 文件
    <JBOSS_HOME>/server/default/deploy

    在 Sun Application Server 访问(启动后)管理控制台
    http://127.0.0.1:4848/asadmin

    并访问 EJB 模块以部署您的 ejb-jar 文件

    由于您在 NetBeans 中部署应用程序时遇到一些问题,我建议如下
  • 创建一个简单的Java库PROJECT(一个没有main方法的简单jar)
  • 将/server/default/lib(包含 jar 文件,以便您检索 EJB 的)jar 文件添加到您的 Java 应用程序,无论您使用的是 JBoss(我不知道 Sun 应用服务器中的哪个目录)
  • 实现上面的代码

  • 现在创建另一个 war 项目
  • 添加我们刚刚在上面创建的项目并添加 /client(包含 jar 文件以便访问我们的 EJB)。我再次不知道 Sun Application Server 中的哪个目录。看看它的文档。
  • 查看答案顶部显示的其全局映射地址

  • 并在您的 Servlet 或其他内容中实现以下代码,无论您使用的是 JBoss
    public static Context getInitialContext() throws javax.naming.NamingException {

    Properties p = new Properties();
    p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
    p.put(Context.URL_PKG_PREFIXES, " org.jboss.naming:org.jnp.interfaces");
    p.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099");

    return new javax.naming.InitialContext(p);
    }

    或者以下是否使用 Sun Application Server - 将文件 appserv-rt.jar(我不知道 Sun Application Server 中哪个过去包含 appserv-rt.jar)在您的类路径中
    public static Context getInitialContext() throws javax.naming.NamingException {

    return new javax.naming.InitialContext();

    }

    为了在我们的 Servlet 或其他东西中访问您的 EJB
    MyBeanRemote myBean = (MyBeanRemote) getInitialContext().lookup(<PUT_EJB_GLOBAL_ADDRESS_RIGHT_HERE>);

    myBean.doSomething();

    问候,

    关于java - ejb 查找因 NamingException 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1473939/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com