难道国内的java就停留在swing,jsp上吗?
没人知道关心ejb2.0的事吗?

解决方案 »

  1.   

    to raindays:
    以下是出错信息:
    java.lang.ClassCastException: ejb20.TraderBean_pf8c35_LocalHomeImpl
    以下是出错代码:
    Context ic    = new InitialContext();
    Object home = (TraderHome)ic.lookup("TraderEJB.TraderHome"); //出错行
    -------------------------------------------------------------
    根据weblogic的文档,Context用默认的就可以了(否则就不必有local interface)了。
      

  2.   

    我觉得classpath问题搞不清楚的,一天到晚嚷着要学jbuilder的等等,都不必看了。
    另外,你如果不能解决这个问题,也就算了吧,这个贴子和你也没什么关系。
      

  3.   

    老大,这个东西是ejb2。0最好是不要直接cast的,用narrowcontext应该这样
    Properties p=new Properties();
    p.setProperty(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
    Context ic = new InitialContext(p);
      

  4.   

    的确是初学者得问题,找找narrow的用法吧,提示一下
    PortableRemoteObject.narrow(xx,xx);不过你解决了,那一分我还是要的。
      

  5.   

    诸位老大,麻烦看一下weblogic的文档(当然是6.1的)先。
    你们提供的方法是调用remote interface ejb使用的,根据weblogic的文档,对于实现local interface的ejb,调用不是这样的(具体请参考wls6.1sp1的sample)。
    谢谢大家的关注。
      

  6.   

    还是没有深入的了解。
    使用RMI/IIOP的容器强调必须对返回的对象使用PortableRemoteObject.narrow(xx,xx)进行处理,而不是直接由客户强调这个对象的类型。而且这个方法有助于确保对所有EJB容器/服务器实现具有最大的互操作性,而不是你去简单的强制返回结果对象类型。也就是说,对所有Home Interface你最好都采取下面的写法
    try {
       Object home = ic.lookup("TraderEJB.TraderHome"); 
       return (TraderHome) narrow(home, TraderHome.class);
    } catch (NamingException ne) {
    }
    另外,难得有同志,即便是完全不懂的来看看,大家也应该欢迎嘛。这么来划清界限总是不好的
      

  7.   

    to airwing:
    首先感谢你的回答,我都以为在这个论坛没有人能/愿意回答我的这个问题了。
    接下来,探讨技术:
    你说的写法,在wls6.1sp1的sample中确实是有的,我特地去看了一下ejb2.0的statelessSessionBean的例子。
    但是,无论从我对local interface的浅薄理解,还是wls6.1sp1的sample(以及文档)来看,对local interface的ejb的调用都不是像你说的那个样子。
    再退一步说,我的程序在lookup时就出错了,还没到你说的那一步。
    另外,我在bea的newsgroup找到答案了,如果你有兴趣,可以自己去看一看(http://newsgroups.bea.com)
    再次感谢你的回答。
      

  8.   

    明白你的意思了,你是想做一个有EJBLocalHome的SessionBean吧,开始还以为你只是在调一个简单的例子。
    翻了一下EJB 2.0的spec,要使用local client view, 则其Home接口必须继承自javax.ejb.EJBLocalHome。你是不是这里出了问题?不过这样讨论讨论,的确不错。顺便问一下,阁下在做哪方面应用,可以再多联系。我的email是[email protected]
      

  9.   

    当然不是这个问题,我的ejb都发布成功了。
    问题在于调用ejb的client和ejb必须在一个jar文件里,我想这很没有道理,应当会改进。
    想当年wls5.1开始时都不支持把自己写的bean,home等等class放到ejb的jar外面,后来就可以了(sp8左右吧)。
    等待6.1的sp2吧...
    我原来做过一次wls5.1的运用,wls6.x是自己在学习的,还不知道什么时候能用上。
    我的mail是[email protected],不过不是每天都去看。
    有问题就到这里来探讨吧,这里虽然水平不高,可是国内都差不多,这里好在速度还比较快。
      

  10.   

    你应该搞错了,我没有你这样的问题。我的任何一个client都不和ejb的jar在一起。而且你的cleint的调法有错误并不影响发布。
      

  11.   

    你去看看weblogic的ejb2.0关于local interface文档部分就知道我说的不错。
    在weblogic的新闻组上有人遇到同样的问题,后来有人说了应当把client和ejb放在同一个jar里并指出了weblogic文档中的位置,后来那个提问的人回贴说就是答复者所说的原因,改过来就对了。
    你说的是非local interface的ejb,当然就不必放在一个jar(几乎从不,除了session作为client调用entity)里。
      

  12.   

    我的意思就是local interface的EJB也不需要
      

  13.   

    我用jb5+weblogic6sp2做了个helloworld sessionbean,deploy没有问题,但用client端
    连接出现corba object not exist的exception,
    client 端的getInitialContext如下
    ..
    Properties p=new Properties();
    p.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
    p.put(Context.PROVIDER_URL,"t3://127.0.0.1:7001");
    ..
      

  14.   

    补充一下,是在lookup home是出错的
      

  15.   

    我用如下方法配置:
    一、 安装和配置 
    先安装Jbuilder5 Enterprise,然后安装Jbuilder5 Person, license key 用Enterprise的。 
    或其他方法,只要确保Jbuilder5 Enterprise,能运行。 
    安装完Jbuilder5,BAS4.5和weblolgic6.0后,就可以开始配置了。 
    (1) 系统环境变量的修改: 
    把系统环境变量TMP、TEMP改为不带有空格的目录;    
    在JB5里菜单    Project ??> Default Project Properties ??>Paths 中把所有带空格的目录改为不带空格的目录;为什么要这样设置呢?因为整合后的 weblogic 和JB5在开发过程中JB5会调用 weblogic 的包来制作EJB,而weblogic对那些有空格的不能很好地识别,工作时会出错,即是说weblogic要接触到的目录,目录名最好不是中文名、带空格。 在使用JB5编辑时会发现光标与实际位置不对齐的问题, 其实只需要在Tools ??>Editor Opntion ??>Color中 把 Reserved Word 设置成不使用粗体和斜体就可以了。 
    (2) jbuilder5 的配置: 
    A、 Tools ??>Configure Libraries 下确定有WebLogic6.0包,其中class中应该加入如下class和路径: 
    C:\bea\wlserver6.0\lib\ cr_wls60f.jar(是Weblogic6.0的crack包) 
    C:\bea\wlserver6.0\lib\weblogic_sp.jar 
    C:\bea\wlserver6.0\lib\weblogic.jar 
    B、Tools Menu ??>Enterprise Setup ??>CORBA    
    ?新增一个weblogic的项,  在Path for ORB tools下,加入Weblogic的目录  
    ?  在Library for projects下,加入 Weblogic6.0 的 库,具体方法是:点“..”,然后选择 Weblogic6.0包;    
    ?在 compiler command 填上 idlj.exe    
    ? 在Command option for output directory 填上一个目录路径,但是要注意的是,不能是中文、带空格。  
      
    C、Tools Menu ??>Enterprise Setup ??>Application Server ??>BAS4.5。1 
    填上 AppServer 安装的目录。 并选上 Enable Integrate.  
    Tools Menu ??>Enterprise Setup ??>Application Server ??>Weblogic6.0    
    填上 Weblogic 安装的目录。 D、配置Default Project Properties 
    Project ??>Default Project Properties ??>Path ??>Required Libraries    
    选择Weblogic6.0;    Project ??>Default Project Properties ??>Build ??>IDL    
    在 IDL compiler 选择Weblogic; 
    在weblogic 页上,什么都不选。  
      
    Project ??>Default Project Properties ??>Run ??>Application  
    ? 选择main class 为 weblogic.Server (当你正确设定Weblogic6.0包后,可以找到该类。)  
    ? 把Complile before running 和 Complile before debugging 的钩子去掉,否则即使你运行一次EJB客户端都好都会重新制作一次EJB包。 
    Project ??>Default Project Properties ??>Enterprise  点“..”这这里选择 Application Server ,当然又是选Weblogic6.0。  选中 Weblogic6.0后点 Edit: 
    ? 在Require Libraries添加 Weblogic6.0包,把其他删除; 
    ? 在class 中删除所有的类的路径; 
    ? 修改VM Parameters:我机器上是 
    -ms64m -mx64m -Djava.library.path=C:/bea/wlserver6.0/bin -Dbea.home=C:/bea -Dweblogic.Domain=Suzhou -Dweblogic.Name=test -Djava.security.policy==C:/bea/wlserver6.0/lib/weblogic.policy  -classpath C:\bea\wlserver6.0\lib\cr_wls60f.jar;C:\bea\wlserver6.0\lib\weblogic_sp.jar;C:\bea\wlserver6.0\lib\weblogic.jar;.  -Dweblogic.management.password=testsystem 
    ? OK。写了个HelloWorld session bean
    成功deploy,client端如下
    package com.ejb.session.stateless.hello;import javax.naming.*;
    import javax.rmi.PortableRemoteObject;
    import java.util.Properties;public class client
    {
      private HelloWorldHome helloWorldHome = null;  /**Construct the EJB test client*/
      public client()
      {
        try
        {
          //get naming context
          Context ctx = getInitialContext();
          //Context ctx = new InitialContext();
          //look up jndi name
          Object ref = ctx.lookup("HelloWorld");      //cast to Home interface
          helloWorldHome = (HelloWorldHome) PortableRemoteObject.narrow(ref, HelloWorldHome.class);
          HelloWorld h1=helloWorldHome.create();
          System.out.println(h1.hello());
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }
      }  //----------------------------------------------------------------------------
      // Utility Methods
      //----------------------------------------------------------------------------  public HelloWorldHome getHome()
      {
        return helloWorldHome;
      }
      /**Main method*/  public static void main(String[] args)
      {
        client client = new client();
        // Use the getHome() method of the client object to call Home interface
        // methods that will return a Remote interface reference.  Then
        // use that Remote interface reference to access the EJB.
      }
      public static Context getInitialContext()
      throws NamingException
      {
        Properties p=new Properties();
        p.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
        p.put(Context.PROVIDER_URL,"t3://127.0.0.1:7001");
        //p.put(Context.SECURITY_PRINCIPAL,user);
        return new InitialContext();
      }
    }启动Weblogic,run client出现以下错误
    org.omg.CORBA.OBJECT_NOT_EXIST:  minor code: 0  completed: No    at java.lang.Class.newInstance0(Native Method)    at java.lang.Class.newInstance(Class.java:237)    at com.inprise.vbroker.orb.SE.read(SE.java:28)    at com.inprise.vbroker.orb.DelegateImpl.handleReply(DelegateImpl.java:711)    at com.inprise.vbroker.orb.DelegateImpl.invoke(DelegateImpl.java:606)    at org.omg.CORBA.portable.ObjectImpl._invoke(ObjectImpl.java:297)    at com.inprise.vbroker.orb.RequestImpl._invoke(RequestImpl.java:195)    at com.inprise.vbroker.orb.RequestImpl.invoke(RequestImpl.java:130)    at org.omg.CosNaming._NamingContextStub.resolve(_NamingContextStub.java:156)    at com.sun.jndi.cosnaming.CNCtx.callResolve(CNCtx.java:324)    at com.sun.jndi.cosnaming.CNCtx.lookup(CNCtx.java:373)    at com.sun.jndi.cosnaming.CNCtx.lookup(CNCtx.java:351)    at javax.naming.InitialContext.lookup(InitialContext.java:350)    at javax.naming.InitialContext.lookup(InitialContext.java:350)    at com.ejb.session.stateless.hello.client.<init>(client.java:20)    at com.ejb.session.stateless.hello.client.main(client.java:45)谁能解决
      

  16.   

    看了半天没弄明白!主要是对supersonics(落叶狂风) 所说的"local interface 的Ejb"没明白!你能否解释一下?
    我所想的和airwing()一样!
    另外我在weblogic5.1和jboss上开发ejb项目已经有几个月了。应该不算新手.
      

  17.   

    http://e-docs.bea.com/wls/docs61/ejb/cmp.html#1080392 :里面有这么一句:
    “Clients of a local bean must be part of an EAR or if not an EAR at least a standalone .jar.“
    我想这句话不是随便写的吧。
    难道你在ejb的jar外调用成功了?
      

  18.   

    to  flying_bird:
    建议你先到java.sun.com去看一看有关ejb2.0的新特性,虽然是英文,但是很通俗易懂(这点非常不容易)。 
      

  19.   

    没看见之前的话吗?
    A local client of a session bean or entity bean may be another EJB, such as a session bean, entity bean, or message-driven bean; it can be a servelet or remote as long as it is part of the same EAR file and as long as it is not remote.
      

  20.   

    to airwing:
    e,你写的这句话不就说明我说的是对的吗?
    算了,我自己写个例子试一下,试完了告诉你。
      

  21.   

    想不到这里讨论ejb挺火的,真是见识不少。
      

  22.   

    你的例子发出来看看?我的理解是local client就是一种避免远程方法调用产生的瓶颈的技术。按它的说明,应该是client和EJB在一个SERVER里就没问题,也就是他们都在一个container里就行了。你以为如何?
      

  23.   

    session bean我已经搞定,可是写entity bean在deploy是出错,是不是要先在weblogic里配好connection pool,在么配?
      

  24.   

    另外请教各位大侠,在jb怎么写带参数的finder,我听说在bas和weblogic里还不一样,是真的吗