JAVA EE-JAVA.rmi.MarshalException发送集合时发生异常

JAVA EE-JAVA.rmi.MarshalException发送集合时发生异常,java,glassfish,rmi,java-ee-6,distributed-system,Java,Glassfish,Rmi,Java Ee 6,Distributed System,我正在为分布式系统课程开发一个JavaEE项目。我想在客户机和EJB之间传递类A的不同实例。 在以下情况下,一切正常: 将类A的实例发送到EJB 从EJB接收类A的实例 从EJB接收集 向EBJ发送集合 但是当我想从客户端向EBJ发送一个集合时,我收到了org.omg.CORBA.MARSHAL:WARNING:00810057:无法加载class rental.a(我在下面附上了日志) 我不理解为什么它说它不能加载这个类,因为它只发送一个实例或从EJB接收一组a 我正在使用以下内容: 爪

我正在为分布式系统课程开发一个JavaEE项目。我想在客户机和EJB之间传递类A的不同实例。 在以下情况下,一切正常:

  • 将类A的实例发送到EJB
  • 从EJB接收类A的实例
  • 从EJB接收
  • 向EBJ发送集合
但是当我想从客户端向EBJ发送一个集合时,我收到了org.omg.CORBA.MARSHAL:WARNING:00810057:无法加载class rental.a(我在下面附上了日志)

我不理解为什么它说它不能加载这个类,因为它只发送一个实例或从EJB接收一组a

我正在使用以下内容:

  • 爪哇8
  • NetBeans 8.2
  • 玻璃鱼4.1.1
这就是我想绕过的物体

package rental;

import java.io.Serializable;

public class A implements Serializable {
    
    private String name;

    public A(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这是EJB方法的接口

package session;

import java.util.Date;
import java.util.List;
import java.util.Set;
import javax.ejb.Remote;
import rental.A;

@Remote
public interface ReservationSessionRemote {
    
    public void reveiveA(A a) throws Exception;
    
    // =========== THIS METHOD FAILS ==============
    public void receiveSetOfA(Set<A> setA) throws Exception;
    
    public A sendA(String name) throws Exception;
    
    public void receiveSetOfString(Set<String> setString) throws Exception;
    
    public Set<A> sendSetA() throws Exception;
    
}

包会话;
导入java.util.Date;
导入java.util.List;
导入java.util.Set;
导入javax.ejb.Remote;
进口租金;
@遥远的
公共接口保留会话远程{
公共无效收入A(A)引发例外;
//==========此方法失败==============
public void receiveSetOfA(Set setA)抛出异常;
公共sendA(字符串名称)引发异常;
public void receiveSetOfString(Set setString)抛出异常;
public Set sendSetA()引发异常;
}
这是EJB的实现

import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import rental.A;

@Stateful
public class ReservationSession implements ReservationSessionRemote {
    
    private static final Logger logger = Logger.getLogger(ReservationSession.class.getName());

    @Override
    public void reveiveA(A a) throws Exception {
        logger.log(Level.INFO, "Received A with value{0}", a.getName());
    }

    @Override
    public A sendA(String name) throws Exception {
        logger.log(Level.INFO, "Sending A with name {0}", name);
        return new A(name);
    }

    // =========== THIS METHOD FAILS ==============
    @Override  
    public void receiveSetOfA(Set<A> setA) throws Exception {
        logger.log(Level.INFO, "Received set of A of size {0}", setA.size());
        setA.forEach((a) -> {
            logger.info(a.getName());
        });
    }

    @Override
    public void receiveSetOfString(Set<String> setString) throws Exception {
        logger.log(Level.INFO, "Received set of String of size {0}", setString.size());
        setString.forEach((s) -> {
            logger.info(s);
        });
    }

    @Override
    public Set<A> sendSetA() throws Exception {
        logger.info("Sending set<A>");
        Set<A> setA = new HashSet<>();
        setA.add(new A("a1-SERVER"));
        setA.add(new A("a2-SERVER"));
        setA.add(new A("a4-SERVER"));
        return setA;
    }
}
import java.util.Set;
导入java.util.logging.Level;
导入java.util.logging.Logger;
进口租金;
@有状态
公共类ReservationSession实现ReservationSessionRemote{
私有静态最终记录器Logger=Logger.getLogger(ReservationSession.class.getName());
@凌驾
public void revivea(A)引发异常{
logger.log(Level.INFO,“收到一个值为{0}”的文件”,A.getName();
}
@凌驾
公共sendA(字符串名称)引发异常{
logger.log(Level.INFO,“发送名为{0}”的文件”,名称);
返回新的名称;
}
//==========此方法失败==============
@凌驾
public void receiveSetOfA(Set setA)引发异常{
logger.log(Level.INFO,“接收到一组大小为{0}”的文件”,setA.size();
刚毛forEach((a)->{
logger.info(a.getName());
});
}
@凌驾
public void receiveSetOfString(Set setString)引发异常{
logger.log(Level.INFO,“收到的字符串集大小为{0}”,setString.size());
设置字符串forEach((s)->{
记录者信息;
});
}
@凌驾
公共集sendSetA()引发异常{
logger.info(“发送集”);
Set setA=新的HashSet();
setA.add(新的a1服务器);
setA.add(新的A(“a2服务器”);
setA.add(新的a4服务器);
返回刚毛;
}
}
这是一个客户端,我在其中运行了一个小脚本,用于测试上面描述的所有场景

public class Main {
    
    private static final Logger logger = Logger.getLogger(Main.class.getName());

    public static void main(String[] args) throws Exception {        
        final String scriptFile = "trips1";
        //logger.log(Level.INFO, "Running file {0}", new Object[]{scriptFile});
        new Main().testConnection();
    }

    protected ReservationSessionRemote getNewReservationSession() throws Exception {
        logger.log(Level.INFO, "[CLIENT] Retrieving SESSION");
        InitialContext context = new InitialContext();
        return (ReservationSessionRemote) context.lookup(ReservationSessionRemote.class.getName());
    }
    
    private void testConnection() throws Exception {
        logger.info("TESTING CONNECTION FOR SERIALIZATION ISSUES");
        ReservationSessionRemote session = getNewReservationSession();
        logger.info("Retrieved ReservationSession");
        session.reveiveA(new A("A-FROM-CLIENT"));
        A a = session.sendA("A-FROM-SERVER");
        logger.log(Level.INFO, "Received A {0}", a.getName());
        try {
            Set<A> setA = new HashSet<>();
            setA.add(new A("a1"));
            setA.add(new A("a2"));
            setA.add(new A("a3"));
            session.receiveSetOfA(setA);  // =========== THIS FAILS ==============
            logger.info("SUCCESSFULY sent set<A>");
        } catch(Exception e) {
            logger.info("COULD NOT SEND set<A>" + e.getMessage());
            //e.printStackTrace();
        }
        try {
            Set<String> setString = new HashSet<>();
            setString.add("s1");
            setString.add("s2");
            setString.add("s3");
            session.receiveSetOfString(setString);
            logger.info("SUCCESSFULY sent set<String>");
        } catch(Exception e) {
            logger.info("COULD NOT SEND set<String>");
        }
        try {
            Set<A> setA = session.sendSetA();
            logger.info("RECEIVED set<A>");
            setA.forEach((x) -> logger.info(x.getName()));
        } catch(Exception e) {
           logger.info("COULD NOT RECEIVE set<A>");
        }
    }
}
公共类主{
私有静态最终记录器Logger=Logger.getLogger(Main.class.getName());
公共静态void main(字符串[]args)引发异常{
最终字符串scriptFile=“trips1”;
//log(Level.INFO,“运行文件{0}”,新对象[]{scriptFile});
新建Main().testConnection();
}
受保护的ReservationSessionRemote getNewReservationSession()引发异常{
logger.log(Level.INFO,“[CLIENT]检索会话”);
InitialContext=新的InitialContext();
return(ReservationSessionRemote)context.lookup(ReservationSessionRemote.class.getName());
}
私有void testConnection()引发异常{
logger.info(“测试序列化问题的连接”);
ReservationSessionRemote会话=getNewReservationSession();
logger.info(“检索到的ReservationSession”);
session.reveiveA(新客户A(“客户A”));
A=session.sendA(“A-FROM-SERVER”);
log(Level.INFO,“接收到一个{0}”,A.getName());
试一试{
Set setA=新的HashSet();
setA.添加(新的A(“a1”));
setA.添加(新的A(“a2”));
setA.添加(新的A(“a3”));
session.receiveSetOfA(setA);//=======此操作失败==============
logger.info(“成功发送集合”);
}捕获(例外e){
logger.info(“无法发送集合”+e.getMessage());
//e、 printStackTrace();
}
试一试{
Set setString=new HashSet();
设置字符串添加(“s1”);
设置字符串添加(“s2”);
设置字符串添加(“s3”);
session.receiveSetOfString(setString);
logger.info(“成功发送集合”);
}捕获(例外e){
logger.info(“无法发送集合”);
}
试一试{
Set setA=session.sendSetA();
logger.info(“接收集”);
setA.forEach((x)->logger.info(x.getName());
}捕获(例外e){
logger.info(“无法接收设置”);
}
}
}
以下是来自客户端的日志

Nov 14, 2020 11:48:00 PM client.Main testConnection
INFO: TESTING CONNECTION FOR SERIALIZATION ISSUES
Nov 14, 2020 11:48:00 PM client.Main getNewReservationSession
INFO: [CLIENT] Retrieving SESSION
Nov 14, 2020 11:48:04 PM client.Main testConnection
INFO: Retrieved ReservationSession
Nov 14, 2020 11:48:04 PM client.Main testConnection
INFO: Received A A-FROM-SERVER
Nov 14, 2020 11:48:04 PM client.Main testConnection
INFO: COULD NOT SEND set<A>java.rmi.MarshalException: CORBA MARSHAL 1330446393 Maybe; nested exception is: 
    org.omg.CORBA.MARSHAL: ----------BEGIN server-side stack trace----------
org.omg.CORBA.MARSHAL: WARNING: 00810057: Could not load class rental.A  vmcid: OMG  minor code: 57 completed: Maybe
    at com.sun.proxy.$Proxy222.couldNotFindClass(Unknown Source)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:983)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:813)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_abstract_interface(CDRInputStream_1_0.java:806)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_abstract_interface(CDRInputStream_1_0.java:796)
    at com.sun.corba.ee.impl.encoding.CDRInputObject.read_abstract_interface(CDRInputObject.java:544)
    at com.sun.corba.ee.impl.io.IIOPInputStream.readObjectDelegate(IIOPInputStream.java:373)
    at com.sun.corba.ee.impl.io.IIOPInputStream.readObjectOverride(IIOPInputStream.java:525)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:425)
    at java.util.HashSet.readObject(HashSet.java:341)
    at sun.reflect.GeneratedMethodAccessor99.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.corba.ee.impl.io.IIOPInputStream.invokeObjectReader(IIOPInputStream.java:1813)
    at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1195)
    at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:407)
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:307)
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:273)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:893)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:995)
    at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:518)
    at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl$14.read(DynamicMethodMarshallerImpl.java:383)
    at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.readArguments(DynamicMethodMarshallerImpl.java:450)
    at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:171)
    at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatchToServant(ServerRequestDispatcherImpl.java:528)
    at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatch(ServerRequestDispatcherImpl.java:199)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequestRequest(MessageMediatorImpl.java:1549)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:1425)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleInput(MessageMediatorImpl.java:930)
    at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:213)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:694)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.dispatch(MessageMediatorImpl.java:496)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.doWork(MessageMediatorImpl.java:2222)
    at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
    at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)

----------END server-side stack trace----------  vmcid: OMG  minor code: 57 completed: Maybe
Nov 14, 2020 11:48:04 PM client.Main testConnection
INFO: SUCCESSFULY sent set<String>
Nov 14, 2020 11:48:04 PM client.Main testConnection
INFO: RECEIVED set<A>
Nov 14, 2020 11:48:04 PM client.Main lambda$testConnection$0
INFO: a4-SERVER
Nov 14, 2020 11:48:04 PM client.Main lambda$testConnection$0
INFO: a2-SERVER
Nov 14, 2020 11:48:04 PM client.Main lambda$testConnection$0
INFO: a1-SERVER
2020年11月14日晚上11:48:00客户端。主测试连接
信息:测试连接是否存在序列化问题
2020年11月14日晚上11:48:00客户端。主getNewReservationSession
信息:[客户端]正在检索会话
2020年11月14日晚上11:48:04客户端。主测试连接
信息:检索到的ReservationSession
2020年11月14日晚上11:48:04客户端。主测试连接
信息:从服务器收到一封电子邮件
2020年11月14日晚上11:48:04客户端。主测试连接
信息:无法发送setjava.rmi.MarshalException:CORBA封送1330446393;嵌套异常是:
org.omg.CORBA.MARSHAL:------------开始服务器端堆栈跟踪----------
org.omg.CORBA.MARSHAL:警告:00
Info:   Received A with valueA-FROM-CLIENT
Info:   Sending A with name A-FROM-SERVER
Info:   Received set of String of size 3
Info:   s3
Info:   s1
Info:   s2
Info:   Sending set<A>