java - 从服务器编码 RMI 客户端回调时遇到问题 - UnmarshalException ClassNotFoundException

标签 java callback client-server rmi

我会尽力使这篇文章尽可能小,以便根据要求添加更多信息和代码。

场景:我正在编写一个服务器/客户端应用程序来跟踪公司的一些流程,因此用户将创建小标签,这些标签将根据工作流程从一个用户的屏幕转到另一个用户的屏幕(用 Swing 编写的客户端) .

我正在运行本地 Glasfish 3.1 服务器(在 Eclipse 中)和 MySql。在服务器上,我运行 Spring MVC 和 Spring Data + Hibernate。

属性文件保存此信息以便于更改:

rmi.serverPort = 1971
rmi.clientPort = 2010

在服务器启动期间,有一个 bean 设置 RMI 环境,如下所示:

  @Autowired
  private RmiData rmiData;
  @Autowired
  private DataRequestHandler dataRequestHandler;
  @Autowired
  private ConnectionRequestHandler connectionRequestHandler;
  .
  .
  .

  LocateRegistry.createRegistry(rmiData.getServerPort());
  String rmiUrl = "rmi://" + rmiData.getHost() + ":" + rmiData.getServerPort() + "/";
  Naming.rebind(rmiUrl + "ConnectionRequestHandler", connectionRequestHandler);
  Naming.rebind(rmiUrl + "DataRequestHandler", dataRequestHandler);

服务器包含两个处理程序的接口(interface)和实现,而客户端仅包含接口(interface)。

这在没有 SecurityManager 和策略文件的情况下工作。尽管我必须将 Hibernate jar 包含到客户端中来解决其他异常(在 SO 上找到解决方案)。

在使客户端连接到服务器并请求数据工作之后,我开始编写对客户端的回调代码(服务器也必须将数据推送到客户端)。所以这就是我现在陷入困境的地方。

这是我如何进行回调(客户端充当服务器):

  private ClientCallbackHandler clientCallbackHandler = new ClientCallbackHandlerImpl();
  .
  .
  .

  LocateRegistry.createRegistry(rmiData.getClientPort());
  String rmiUrl = "rmi://localhost:" + rmiData.getClientPort() + "/";
  Naming.rebind(rmiUrl + "ClientCallbackHandler", clientCallbackHandler);

服务器仅包含客户端接口(interface),客户端同时具有处理程序的接口(interface)和实现。

那么当服务器执行时

  String rmiUrl = "rmi://" + clientHost + ":" + clientPort + "/";
  clientCallbackHandler = (ClientCallbackHandler)Naming.lookup(rmiUrl + "ClientCallbackHandler");

我在服务器上遇到以下异常:

  SEVERE: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: br.com.affair.socontrol.rmi.ClientCallbackHandlerImpl (no security manager: RMI class loader disabled)

我避免安装 SecurityManager 和策略文件(也尝试过但没有成功),但我被困在这里。

我无法理解为什么服务器会提示实现类,因为它只需要接口(interface)。任何帮助深表感谢。谢谢。

最佳答案

经过几个小时的努力,我终于找到了问题所在。

ClientCallbackHandlerImpl 类未扩展UnicastRemoteObject。 之后代码就顺利运行了。感谢您阅读这篇文章并思考一些问题。

PS:我知道这看起来像是菜鸟的错,但我避免进行代码复制/粘贴。

关于java - 从服务器编码 RMI 客户端回调时遇到问题 - UnmarshalException ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233401/

相关文章:

java - Tomcat 8 Docx4j 应用问题

java - BasicClientConnManager 使用无效 : connection still allocated

java - 在 QueryDSL 分组转换器中计数

java - 使用 Java 中的构造函数进行深复制

Java:如何编写接受实现给定接口(interface)的枚举常量的通用函数?

javascript - 回调函数的用处

python - 订阅 Tornado 事件

c++ - 泛化 C++11 线程类以使用 lambda

http - 避免缓存 http 响应

c# - 从客户端发送字节数组到服务器?