【问题标题】:EJB - Serialization error while doing a JNDI lookup for a Stateful Session BeanEJB - 为有状态会话 Bean 执行 JNDI 查找时出现序列化错误
【发布时间】:2011-11-01 11:23:57
【问题描述】:

在我的 EJB 项目中,我有这个会话 Bean(有状态):

@Stateful
public class StatefulShopCart implements StatefulShopCartLocal, Serializable {

    private static final long serialVersionUID = 1L;

    private transient HashMap<Integer, Integer> cantitati;
    private Vector<ProdusDTO> produse;

    /**
     * Default constructor. 
     */
    public StatefulShopCart() {
        try{
            cantitati = new HashMap<Integer, Integer>();
            produse = new Vector<ProdusDTO>();
        }catch(Exception ex) {
            System.out.println("[[[ //// Error \\\\ ]]]: "+ex.getMessage());
            System.out.println(ex.getStackTrace());
        }
    }

    @Override
    public void Adauga(int id) {
        try {
            InitialContext ctx = new InitialContext();
            StatelessInterogareRemote bean = (StatelessInterogareRemote) ctx
                .lookup("java:global/ShopEAP/ShopEJB/StatelessInterogare");
                    ...
        }catch(Exception ex) {
            System.out.println("[[[ Error ]]]: "+ex.getMessage());
            System.out.println(ex.getStackTrace());
        }
    }

    @Override
    public Vector<ProdusDTO> ProduseAdaugate() {
        return produse;
    }

    //@Override
    public HashMap<Integer, Integer> CantitatiProduse() {
        return cantitati;
    }

    @Override
    public double ValoareTotala() {
        StatelessCartLocal beanCart = null;
        try {
            InitialContext ctx = new InitialContext();
            beanCart = (StatelessCartLocal) ctx
                .lookup("java:global/ShopEAP/ShopEJB/StatelessCart");
        }catch(Exception ex) {
            System.out.println("+++ Error +++ " + ex.getMessage() + "\r\n" + ex.getStackTrace());
        }
        return beanCart.Calculeaza(produse, cantitati);
    }

}

StatefulShopCartLocal 接口:

@Local
public interface StatefulShopCartLocal {
    void Adauga(int id);
    Vector<ProdusDTO> ProduseAdaugate();
    HashMap<Integer, Integer> CantitatiProduse();
    double ValoareTotala();
}

当我在应用程序客户端项目中进行查找时:

InitialContext ctx = new InitialContext();
beanCart = (StatelessCartLocal) ctx
    .lookup("java:global/ShopEAP/ShopEJB/StatelessCart");

我收到此错误:

Nov 1, 2011 1:15:46 PM com.sun.enterprise.transaction.JavaEETransactionManagerSimplified initDelegates
INFO: Using com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate as the delegate
Nov 1, 2011 1:15:47 PM com.sun.enterprise.naming.impl.SerialContext lookup
SEVERE: enterprise_naming.serialctx_communication_exception
Nov 1, 2011 1:15:47 PM com.sun.enterprise.naming.impl.SerialContext lookup
SEVERE: 
java.rmi.MarshalException: CORBA BAD_PARAM 1330446342 Maybe; nested exception is: 
    java.io.NotSerializableException: ----------BEGIN server-side stack trace----------
org.omg.CORBA.BAD_PARAM:   vmcid: OMG  minor code: 6 completed: Maybe
    at com.sun.corba.ee.impl.logging.OMGSystemException.notSerializable(OMGSystemException.java:990)
    at com.sun.corba.ee.impl.logging.OMGSystemException.notSerializable(OMGSystemException.java:1005)
    at com.sun.corba.ee.impl.orbutil.ORBUtility.throwNotSerializableForCorba(ORBUtility.java:753)
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_abstract_interface(CDROutputStream_1_0.java:765)
    at com.sun.corba.ee.impl.encoding.CDROutputObject.write_abstract_interface(CDROutputObject.java:709)

...

at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at Main.runTest(Main.java:49)
    at Main.main(Main.java:17)
Caused by: java.io.NotSerializableException: ----------BEGIN server-side stack trace----------
org.omg.CORBA.BAD_PARAM:   vmcid: OMG  minor code: 6 completed: Maybe
    at com.sun.corba.ee.impl.logging.OMGSystemException.notSerializable(OMGSystemException.java:990)
    at com.sun.corba.ee.impl.logging.OMGSystemException.notSerializable(OMGSystemException.java:1005)

...

我认为这是该会话 bean 的序列化问题,但我做错了什么?

谢谢。

【问题讨论】:

  • 顺便说一句:为什么要实现 Serializable ?
  • 仅在方法级别处理:如果在远程业务接口中公开方法,则返回和参数类型实现 Serializable 接口
  • ejb 有它的钝化对象的方式...

标签: java ejb stateless-session-bean session-bean stateful-session-bean


【解决方案1】:

我在这里有一个关于如何访问会话 bean 的示例:

http://javastuff.info/?p=110

来自远程客户端和本地客户端。

对于同一应用服务器上的本地访问,您不再需要初始上下文,您可以通过@EJB 直接注入 ejb

【讨论】:

  • 感谢您的帮助,但我的问题是,在 Application Client Project 中进行第一次查找时,在方法 void main 中,出现上述错误:
  • java.rmi.MarshalException: CORBA BAD_PARAM 1330446342 也许;嵌套异常是:java.io.NotSerializableException: ...
  • yes remove serializable ...因为这里容器负责处理,然后在应用程序客户端中,您可以通过 @EJB 注释注入应用程序客户端中的 bean,因为它位于同一 VM 上
猜你喜欢
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2012-01-02
  • 2012-04-04
  • 2013-04-30
相关资源
最近更新 更多