0

CORBA 名前空間上にオブジェクト階層を構築したいので、このチュートリアルを試しました

http://docs.oracle.com/javase/7/docs/technotes/guides/idl/jidlNaming.html

NameClient.java のコンパイルに成功し、localhost で orbd を起動して、テストを実行しました。次の例外で失敗しました。

java.lang.ClassCastException: org.omg.CosNaming._NamingContextStub cannot be cast to org.omg.CosNaming.NamingContextExt
        at NameClient.main(NameClient.java:24)

NameClient クラスのソース コード:

import java.util.Properties;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;

public class NameClient
{
   public static void main(String args[])
   {
      try {
        Properties props = new Properties();
        props.put("org.omg.CORBA.ORBInitialPort", "1050");
        props.put("org.omg.CORBA.ORBInitialHost", "localhost");
        ORB orb = ORB.init(args, props);
        NamingContextExt ctx =
          NamingContextExtHelper.narrow(orb.resolve_initial_references(
            "NameService"));
        org.omg.CORBA.Object objref = ctx;

        NameComponent name1[] = ctx.to_name("plans");
        ctx.rebind(name1, objref);
        System.out.println("plans rebind successful!");

        NameComponent name2[] = ctx.to_name("Personal");
        NamingContextExt ctx2 = (NamingContextExt)ctx.bind_new_context(name2);
        System.out.println("New naming context, Personal, added!");

        NameComponent name3[] = ctx.to_name("schedule");
        ctx2.rebind(name3, objref);
        System.out.println("schedule rebind successful!");

        NameComponent name4[] = ctx.to_name("calendar");
        ctx2.rebind(name4, objref);
        System.out.println("calendar rebind successful!");


    } catch (Exception e) {
        e.printStackTrace(System.err);
    }
  }  
}

この例はうまくいくはずではありませんか? このエラーを渡す方法はありますか?

助けてくれてありがとう。

4

1 に答える 1

0

最後にコルバを使ったのは数年前です。Java の「キャスト」演算子をそのまま使用しないという考えを思い出すと、CORBA オブジェクトをキャストする推奨される方法は、ターゲット タイプの「ヘルパー」メソッドを使用して name2 を ctx2 に絞り込むことでした。私はお勧め

    NameComponent name2[] = ctx.to_name("Personal");
    NamingContextExt ctx2 = NamingContextExtHelper.narrow(name2);

    not

    NamingContextExt ctx2 = (NamingContextExt)ctx.bind_new_context(name2);
于 2014-03-31T01:21:27.403 に答える