local调用是有条件的,客户端和BEAN要在同一个JVM中或者是同一个应用服务器中。

解决方案 »

  1.   

    ejb-jar.xml怎么写的?还有调用的时候是怎么调用的啊?贴出来看看啊
      

  2.   

    这个是怎么得到保证或实现的呢?
    比如我写了一个实体bean 
    然后新建一个application
    启动weblogic
    deploy实体bean
    然后run application
    这样有什么问题吗
    谢谢
      

  3.   

    我没有写xml
    这个是jbuilder自动生成的
    该不是这个有问题吧?
    不论我写的任何bean
    本地接口都不能调用。ejb-jar.xml如下<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
    <ejb-jar>
        <enterprise-beans>
            <entity>
                <display-name>Member</display-name>
                <ejb-name>MemberCMP</ejb-name>
                <home>sqldemo.MemberCMPRemote</home>
                <remote>sqldemo.MemberCMP</remote>
                <local-home>sqldemo.MemberCMPHome</local-home>
                <local>sqldemo.MemberCMPLocal</local>
                <ejb-class>sqldemo.MemberCMPBean</ejb-class>
                <persistence-type>Container</persistence-type>
                <prim-key-class>java.lang.String</prim-key-class>
                <reentrant>False</reentrant>
                <cmp-version>2.x</cmp-version>
                <abstract-schema-name>MemberCMP</abstract-schema-name>
                <cmp-field>
                    <field-name>id</field-name>
                </cmp-field>
                <cmp-field>
                    <field-name>name</field-name>
                </cmp-field>
                <primkey-field>id</primkey-field>
            </entity>
        </enterprise-beans>
        <assembly-descriptor>
            <container-transaction>
                <method>
                    <ejb-name>MemberCMP</ejb-name>
                    <method-name>*</method-name>
                </method>
                <trans-attribute>Required</trans-attribute>
            </container-transaction>
        </assembly-descriptor>
    </ejb-jar>weblogic-ejb-jar.xml如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB//EN' 'http://www.bea.com/servers/wls700/dtd/weblogic-ejb-jar.dtd'>
    <weblogic-ejb-jar>
        <weblogic-enterprise-bean>
            <ejb-name>MemberCMP</ejb-name>
            <entity-descriptor>
                <persistence>
                    <persistence-use>
                        <type-identifier>WebLogic_CMP_RDBMS</type-identifier>
                        <type-version>6.0</type-version>
                        <type-storage>META-INF/weblogic-cmp-rdbms-jar.xml</type-storage>
                    </persistence-use>
                </persistence>
            </entity-descriptor>
            <jndi-name>MemberCMPRemote</jndi-name>
            <local-jndi-name>MemberCMP</local-jndi-name>
        </weblogic-enterprise-bean>
    </weblogic-ejb-jar>application如下:Properties pro = new Properties();
    pro.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        
    try{
        InitialContext ic = new InitialContext(pro);
        Object obj = ic.lookup("MemberCMP");
        MemberCMPHome home = (MemberCMPHome)PortableRemoteObject.narror(obj,MemberCMPHome.class);
        MemberCMPLocal local = home.findByPrimaryKey("某id");
        System.out.println(local.getName());
       }catch(Exception e){    }怎么就不行呢
    大家帮我看看
    谢谢
      

  4.   

    还有,把你的jb换一下吧,9也成,X更好,2004年了,还用7啊~:)
      

  5.   

    这个x哪里有下啊?
    jbuilder9我也配置了
    而且我也写了bean
    也不行
    因为刚开始怀疑是不是jbuilder7的问题:(
    7和9的配置过程是不是差不多阿
    我按7的方法配置
    怎么后来发现配置好9后的default ProjectProperties里的paths——〉Required Libraries里面没有weblogic 8+ client 和weblogic 8+ deploy阿
    是不是配置错了
    给我发送一个标准的配置过程
    谢谢
      

  6.   

    MemberCMPHome home = (MemberCMPHome)PortableRemoteObject.narror(obj,MemberCMPHome.class);
    本地接口不需要narror的。MemberCMPHome home= (MemberCMPHome)ic.lookup("MemberCMP");就可以了。你改成这样再试试。还有,jb可以自已建lib的。
      

  7.   

    我的机器现在jb跑不起来,工作ing 。呵呵,下班再说怎么配jb吧。其实很简单的
      

  8.   

    你推荐的这个方法我也早就试过了
    不过还是不行
    所以我头都大了
    而且关键问题是我实验室的电脑和宿舍的电脑都跑过了jb7和jb9
    结论都是不行
    真是怪阿
    要说我配置错了
    那怎么remote接口怎么能行呢。。
      

  9.   

    你说的意思我没太明白,你是要调用实体bean的本地接口吗?
      

  10.   

    是的
    当然session bean也一样
    就是像调用remote接口一样
    但是local就是不行
    而且在生成只有localhome和local的情况下(没有remotehome和remote)
    如果想自动生成EJBtestclient都不行
      

  11.   

    而且同时
    在weblogic控制台里的jndi tree里
    localhome和local的bind name有
    而object class,object hash code和object to string 三项都没有出现。
      

  12.   

    回复人: zengjunhua(zjh) ( ) 信誉:100  2004-03-24 14:20:00  得分:0 
     
     
      这个是怎么得到保证或实现的呢?
    比如我写了一个实体bean 
    然后新建一个application
    启动weblogic
        ~~~~~~~~~~~~~~~~~~~
    deploy实体bean
    然后run application
        ~~~~~~~~~~~~~~~~~~~这样就是两个不同的JVM呀,调local接口当然调不到啦!
    这样有什么问题吗
    谢谢
      
     
    你可以写个servlet,部署到weblogic上,通过servlet直接或间接调用ejb这才算同一个JVM
      

  13.   

    那我另外写了一个session bean
    然后从session bean里调用entity bean的本地接口
    这样算在一个jvm里吗?
    但是这种我做了以后好像也不行
      

  14.   

    env.put(Context.PROVIDER_URL,"t3://localhost:7001");楼主是不是这个没有加上啊?我是不知道怎么回事了。还有,楼主对jvm理解有偏差。一个jvm即一个java虚拟机,不光只在一个Application或一个server里的程序才是在一个jvm里面的。只要是运行的时候使用的是同一个jvm,那都叫一个jvm.在不同机器上使用同一个jvm我还没听过,但在同一部机器上运行两个不同的jvm还没见过是什么样子的。
      

  15.   

    env.put(Context.PROVIDER_URL,"t3://localhost:7001");
    这个我也加过
    还有什么password之类都加过
    但是还是不行
    真是命苦
    怎么两台电脑都不行呢。
    该不是我配置jb的时候有问题吧
      

  16.   

    **************************
    那我另外写了一个session bean
    然后从session bean里调用entity bean的本地接口
    这样算在一个jvm里吗?
    但是这种我做了以后好像也不行*************************1. 不太明白,你是怎么调用你的session bean 的.2. 你可以把你的错误贴出来吗? 3. 你用SERVLET 来做一下测试,我确定没有问题!!!4. 我做一下看看有没有问题,一会回贴!
      

  17.   

    我对你问题的理解不知道对不对!我觉得你好象根本没有理解本地接口的意思,所谓本地接口是不能直接让你的客户端来进行调用的,之所以有本地接口这个概念我觉得主要是给实体Bean设计的,定义成本地接口可以免去网络传输带来的速度上的影响,至于怎样去调用实体Bean呢?这就需要用一个会话Bean来进行封装,你可以把会话Bean定义成远程接口,我们都知道一般来说会话Bean是不用来访问数据库的,它只是处理一些简单的逻辑,所以在速度方面不会有太大的影响,如果你需要在会话Bean当中访问数据库的话,你可以再用一个会话Bean来封装,把访问数据库的会话Bean定义成本地接口.我是这样理解的,我也是刚开始学EJB开发,说的不对的地方请高手指教了!
      

  18.   

    所谓本地接口是不能直接让你的客户端来进行调用的,之所以有本地接口这个概念我觉得主要是给实体Bean设计的,定义成本地接口可以免去网络传输带来的速度上的影响楼上的说错了,我开始也是这样理解的,但是大虾们指出来,这样理解是不对的。local接口,不需要进行远程访问,不产生rmi调用,以来提高性能,但是前提是调用方必须是在同一个jvm中运行的程序。楼主看一下weblogic的console,看看jndi tree,是不是把这个本地接口绑定上了?
      

  19.   

    支持  etiox(小乙) 的说法! 这样就是在两个JVM里面运行的!
      

  20.   

    1. 不太明白,你是怎么调用你的session bean 的.
       我打算用一个application用remote调用session bean,实际上最终的意图无非就是用session bean 封装entity entity,entity bean 采用local接口性能有所改进2. 你可以把你的错误贴出来吗? 
       我用application的时候无论create(),getxxx,setxxx都没结果,也就没报错,所以没办法贴3. 你用SERVLET 来做一下测试,我确定没有问题!!!
       servlet我还没做,因为现在在宿舍,电脑配置不行4. 我做一下看看有没有问题,一会回贴!
       谢谢你
      

  21.   

    使用LOCAL 模式说白了就是使得到对象的方法由 序列化 变成 引用,但要在一个JVM下运行.
    我们的项目用的都是LOCAL 模式.
      

  22.   

    1. 不太明白,你是怎么调用你的session bean 的.
       我打算用一个application用remote调用session bean,实际上最终的意图无非就是用session bean 封装entity entity,entity bean 采用local接口性能有所改进
       ************
       我想单独运行一个application, 就是在一个JVM下,你布署的EJB 还是一个JVM ,两个JVM下用LOCAL模式是不行的.
       
    2. 你可以把你的错误贴出来吗? 
       我用application的时候无论create(),getxxx,setxxx都没结果,也就没报错,所以没办法贴
       **********
       我想没有报错是因为你没有把得到 JNDI 的方法写到TRY CATCH 里面. 如果是一定会报错的.3. 你用SERVLET 来做一下测试,我确定没有问题!!!
       servlet我还没做,因为现在在宿舍,电脑配置不行
       *************
       我做的都是用SERVLET 来调SESSION BEAN的,因为它们布署在同一个EJB容器里.所以用LOCAL模式没有问题.4. 我做一下看看有没有问题,一会回贴!
       谢谢你
       ***********
       没有帮什么忙,不用谢!
      

  23.   

    我先问dreamnear(哟哟) 个问题,你说客户端能不能直接调用服务端的本地接口?