【问题标题】:class cast exception in narrow a jndi reffrence in ejb在 ejb 中缩小 jndi 引用中的类强制转换异常
【发布时间】:2011-10-12 14:51:27
【问题描述】:

我正在尝试编写一个简单的无状态会话 bean,但我在查找时给出的狭窄参考存在问题。 我得到了

类转换异常

我用

Eclipse IDE

我的豆类

package codes;
import java.rmi.RemoteException;

import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;


public class SinaBean implements SessionBean {


    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public String getHello()
    {
        return "hello";
    }
    public void ejbCreate(){

    }
    @Override
    public void ejbActivate() throws EJBException, RemoteException {
        // TODO Auto-generated method stub

    }

    @Override
    public void ejbPassivate() throws EJBException, RemoteException {
        // TODO Auto-generated method stub

    }

    @Override
    public void ejbRemove() throws EJBException, RemoteException {
        // TODO Auto-generated method stub

    }

    @Override
    public void setSessionContext(SessionContext arg0) throws EJBException,
            RemoteException {
        // TODO Auto-generated method stub

    }

}

我的主界面

package codes;

import java.rmi.RemoteException;

import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface SinaHome extends EJBHome {

    public SinaObject create() throws RemoteException,CreateException;
}

我的组件

package codes;

import java.rmi.RemoteException;

import javax.ejb.EJBObject;

public interface SinaObject extends EJBObject {

    String getHello() throws RemoteException;
}

我的客户

package codes;

import java.util.Properties;

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

public class Client {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Context con=null;
        try {   
            Properties p=new Properties();
            p.setProperty(Context.INITIAL_CONTEXT_FACTORY,
            "org.jnp.interfaces.NamingContextFactory");
            p.setProperty(Context.PROVIDER_URL, "localhost:1099");
            p.setProperty(Context.URL_PKG_PREFIXES,
            "org.jboss.namingrg.jnp.interfaces");
            con = new InitialContext(p);
            Object o=con.lookup("SinaBean");
                       System.out.println(o);/***/untill know it works.it sysout : 
                       //org.jnp.interfaces.NamingContext@e83912*** 

            @SuppressWarnings("unused")
            SinaHome sh=(SinaHome)PortableRemoteObject.narrow(o, SinaHome.class);//***exeption is here!!***
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}

我的 xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
  <display-name>Ejb </display-name> 
  <enterprise-beans>

  <session>

  <display-name>SinaBean</display-name>
  <ejb-name>SinaBean</ejb-name>
  <home>codes.SinaHome</home>
  <remote>codes.SinaObject</remote>
  <ejb-class>codes.SinaBean</ejb-class> 
  <session-type>Stateless</session-type>
  <transaction-type>Bean</transaction-type> 

  <security-identity>
  <description></description>
  <use-caller-identity></use-caller-identity>
  </security-identity> 

  </session>

  </enterprise-beans>

 </ejb-jar>

我收到的异常

java.lang.ClassCastException
    at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:229)
    at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
    at codes.Client.main(Client.java:27)
Caused by: java.lang.ClassCastException: org.jnp.interfaces.NamingContext cannot be cast to org.omg.CORBA.Object
    at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:212)
    ... 2 more

我将非常感谢您的建议。

【问题讨论】:

    标签: java eclipse ejb jndi narrowing


    【解决方案1】:

    首先,您的 xml 文件表明您正在使用 EJB3(这实际上是唯一值得考虑的版本),但您的 bean 是 EJB2 bean。

    如果您的服务器确实运行 EJB3,请删除 XML 文件并删除不必要的 EJB 主目录和组件实现。添加@Stateless 注释和远程接口。确保它看起来像这样:

    @Remote
    public interface SinaRemote {
        String getHello();
    }
    
    @Stateless
    public class SinaBean implements SinaRemote {
    
        public String getHello() {
            return "hello";
        }
    }
    

    然后更正您的 JNDI 属性。以下是错误的:

    p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.namingrg.jnp.interfaces");

    应该是:

    p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");

    (人们在这里使用的变体几乎是无穷无尽的,而且它基本上总是有效,但只是为了确保使用正确的变体)

    此外,很可能是罪魁祸首,您使用ejb-name 好像它是一个全局 JNDI 名称,但事实并非如此。 ejb-name 是一个有点令人困惑的逻辑名称,在注入或创建 ejb-ref 时引用特定 bean 时,它用作一种额外的限定符。

    在您的情况下,您将其设置为与非限定 bean 名称相同,这已经是默认值。由于SinaBean 存在,我猜你不是通过EAR 部署,而是部署一个独立的EJB jar,对吧?

    如果您使用 JBoss AS 6 (EJB3.1),您可以使用 global portable JNDI names,否则可以使用旧的 JBoss 特定 JNDI 命名:[ear name]/[simple bean name]/remote。请注意,[simple bean name] 不是 ejb 名称,但在您的情况下它们恰好是相同的。由于仅在部署 EJB jar 时删除了 [ear name]/,这解释了您得到的异常:SinaBean 是一个目录(在 JNDI 术语中 context),它可以包含实际的条目localremoteno-interface。您正在做的是尝试将此中间目录节点强制转换为您的 bean 的代理,这当然是行不通的。

    不管怎样,最后,去掉PortableRemoteObject的用法,这里是no longer needed。客户端代码将如下所示:

    Properties properties = new Properties();
    properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
    properties.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
    properties.setProperty(Context.PROVIDER_URL, "localhost:1099");
    context = new InitialContext(properties);
    SinaRemote sina = (SinaRemote) context.lookup("SinaBean/remote");
    

    【讨论】:

    • 感谢您的出色回答..现在可以工作了!!我的问题已解决,更大的问题是可用的过时书,他们唯一的利润是悬空读者..再次感谢跨度>
    【解决方案2】:

    这里如果您使用 EJB 2.0 和 Jboss 5.0 并尝试从客户端将对象 obj 类型转换为您的主对象,如下所示,那么它可能会抛出 java.lang.ClassCastException com.sun.proxy.$Proxy104 cannot被强制转换为 org.omg.CORBA.Object .

    查找 JNDI 的代码: java.lang.Object obj = ctx.lookup("java:comp/env/ATSessionBean"); ATHome home = (ATHome) PortableRemoteObject.narrow(obj, ATHome.class);

    解决方案:这里你需要在客户端应用程序的类路径中添加额外的 jars,这些 jars 在更高版本的 JBOSS 中可用。 最好下载最新版本的 **jboss-7.1.1.Final 服务器并部署您的应用程序,它将成功运行。 :)** 从以下链接下载 JBOSS 服务器(下载 EAP 6.4.0)http://jbossas.jboss.org/downloads/

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多