RMI Client Servlet获取ClassNotFoundException

时间:2014-06-24 05:44:25

标签: java servlets tomcat7 rmi classnotfoundexception

我已经深入搜索了论坛,但我找不到我的这个问题的答案,所以我希望你们能给我一些反馈。

我是一名学生,目前正在部署基于网络的RMI系统作为任务。我正在使用Eclipse EE Java IDE。

我的服务器非常简单:

package server;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import controlador.Controlador;
import tda.TDAManejoDatos;

public class Server {

    TDAManejoDatos objetoRemoto;

    public static void main(String[] args)
    {
        new Server();
    }

    public Server() {
        iniciar();
    }

    public void iniciar() {
        try {
            LocateRegistry.createRegistry(1098);    
            TDAManejoDatos controladorRemoto = Controlador.getControlador();
            Naming.rebind ("//localhost/TPOAD_Servidor", controladorRemoto);
            System.out.println("//localhost/TPOAD_Servidor");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

您可能已经猜到, TDAManejoDatos 是我的远程接口。

客户端是 .jsp 页面,我目前正在使用 Tomcat 7

.jsp 页面有一个表单,该表单将某些数据提交给 servlet 。所以就此而言,我在doPost()中有一个方法可以做到这一点:

 request.setAttribute("mozo", Server.getInstance().loginMozo(
                     request.getParameter("user"), 
                     request.getParameter("password"))
                );

因此,数据被转发到“客户端服务器”,这实际上是一个充当真实服务器和客户端之间的中间层的类。这样做的唯一目的就是将远程服务器从客户端隐藏起来,因此它“认为”所有方法都是在本地调用的。换句话说,它隐藏了客户端的远程复杂性。

是的,这个类也被称为“服务器”,但它与我首先向您展示的“真实”服务器完全不同。

package controladorRemoto;

import java.rmi.Naming;
import java.rmi.RemoteException;
import javax.security.auth.login.LoginException;
import tda.TDAManejoDatos;
import DTOs.MozoDTO;

public class Server {

    private static Server instance;

    private TDAManejoDatos server;

    private Server(){
        getStub();
    }

    public static Server getInstance(){
        if(instance==null)
            instance = new Server();

        return instance;
    }

    private boolean getStub() {

        try {
            server = (TDAManejoDatos)Naming.lookup("//localhost/TPOAD_Servidor");
            return true; //Si devuelve verdadero se pudo conectar y encontrar la referencia al objeto.
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    public MozoDTO loginMozo(String user, String password) {

        MozoDTO mozo = null;

        try {
            mozo = server.loginMozo(user, password);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (LoginException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return mozo;
    }

}

问题出在哪里。即使服务器已启动并运行,我的 getStub()函数每次都会失败,并出现此错误:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: tda.TDAManejoDatos (no security manager: RMI class loader disabled)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Unknown Source)
    at controladorRemoto.Server.getStub(Server.java:33)
    at controladorRemoto.Server.<init>(Server.java:20)
    at controladorRemoto.Server.getInstance(Server.java:25)
    at servlet.Servlet.doPost(Servlet.java:56)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

我不知道这个ClassNotFound异常是什么,因为我的界面设置在那里。此外,我过去已经成功部署了其他RMI系统,但这是我第一次通过Web部署它(换句话说,使用Tomcat)。

我非常感谢任何帮助,因为我正在与这个项目进行一场全天候比赛。

提前致谢。

编辑:这个被标记为状态副本的问题“我甚至尝试在同一台机器上运行它(未更改的程序)并且它可以工作,但它在diff机器上不起作用。”虽然异常是相同的,但在这种情况下,服务器和客户端都在同一台物理机器上运行,但仍然无法正常工作。此外,我还不清楚如何解决这个问题的说明。非常感谢任何帮助。

编辑#2:我在自己的项目中有远程接口,客户端项目和服务器项目都链接到该项目。他们一直都是。

因此,客户端和服务器始终具有与接口完全相同的引用。用户AminSaghi在另一个问题中表示,他通过在客户端和服务器中使用对接口的相同引用来解决问题;我的这个项目一直都有。我真的对此感到困惑。

0 个答案:

没有答案