7

単純なステートレス セッション Bean を作成しようとしていますが、検索時に与える狭い参照に問題があります。私は得た

クラスキャスト例外

私が使う

日食 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

私はあなたのアドバイスに非常に感謝しています。

4

2 に答える 2

7

まず第一に、あなたの 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) を使用している場合は、移植可能なグローバル JNDI 名を使用できます。それ以外の場合は、古い JBoss 固有の JNDI 命名を使用できます[ear name]/[simple bean name]/remote。[単純な Bean 名] は ejb 名ではありませんが、あなたの場合もたまたま同じであることに注意してください。[ear name]/EJB jar のみをデプロイしている場合は が削除されるため、これは取得している例外を説明しています:はSinaBeanディレクトリ ( JNDI 用語ではコンテキストlocal) であり、実際のエントリとremoteを含むことができますno-interface。あなたがしているのは、この中間ディレクトリ ノードをプロキシにキャストして Bean にしようとすることですが、もちろんうまくいきません。

とにかく、最後に の使用を削除します。PortableRemoteObjectこれはもう必要ありません。クライアントコードは次のようになります。

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");
于 2011-07-25T18:51:00.433 に答える
0

ここで、EJB 2.0 を Jboss 5.0 とともに使用し、以下のようにクライアントからホーム オブジェクトにキャスト オブジェクト obj を入力しようとすると、 java.lang.ClassCastException com.sun.proxy.$Proxy104 cannot be cast to org.omgがスローされる可能性があります。 .CORBA.Object .

JNDI をルックアップするコード: java.lang.Object obj = ctx.lookup("java:comp/env/ATSessionBean"); ATHome ホーム = (ATHome) PortableRemoteObject.narrow(obj, ATHome.class);

解決策 : ここでは、JBOSS の上位バージョンで利用可能なクライアント アプリのクラスパスに追加の jar を追加する必要があります。 そのため、最新バージョン **jboss-7.1.1.Finalサーバーをダウンロードしてアプリケーションをデプロイすると、正常に実行されます。:)**以下のリンクからJBOSS サーバー(EAP 6.4.0 をダウンロード)をダウンロードします: http://jbossas.jboss.org/downloads/

于 2015-05-07T06:33:31.930 に答える