簡體   English   中英

IOException封送處理EJB參數

[英]IOException marshaling EJB parameters

我試圖從另一個Web應用程序(特別是Servlet)調用ejb,並且兩者都托管在同一JBoss AppServer上。

第一次,如果我使用String / integer返回值/類型調用ejb方法,看起來就不錯了。但是,如果我使用自定義返回類型調用方法,則將獲得“ IOException編組EJB參數”,盡管自定義類定義為在“ WEB-INF / lib /”上可用...我認為這是一個有點大影響的問題:-(

ejb項目結構: 在此處輸入圖像描述 web-app項目結構在此處輸入圖像描述

遠程ejb類也鏈接到Web應用程序

遠程:

package ma.remote;

import javax.ejb.Remote;


@Remote
public interface TestBeanRemote {
    public DataCenter getData();
    public String getStatus();

}

實現方式:

package ma.server;

import javax.ejb.Stateless;
import ma.remote.DataCenter;
import ma.remote.TestBeanRemote;


@Stateless
public class TestBeanImpl implements TestBeanRemote{

    @Override
    public DataCenter getData() {
        return new DataCenter("Lasname", "fistname", "examplestreet. 505", "berlin");
    }

    @Override
    public String getStatus() {
        String ret = "EJB funktioniert";
        System.out.println("public String getStatus():\n" + ret);

        return ret;
    }

}

自定義類:

package ma.remote;


public class DataCenter {
    public String Name;
    public String Vorname;
    public String Adresse;
    public String Stadt;

    public DataCenter(String Name, String Vorname, String Adresse, String Stadt)
    {
        this.Name = Name;
        this.Vorname = Vorname;
        this.Adresse = Adresse;
        this.Stadt = Stadt;
    }
}

webapp和ejb已成功部署在JBoss 7.1上

14:09:03,010 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 1) JBAS018565: Replaced deployment "ejb-ejb.jar" with deployment "ejb-ejb.jar"
    14:11:08,472 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015877: Stopped deployment ejb-ejb.jar in 7ms
    14:11:08,472 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) JBAS015876: Starting deployment of "ejb-ejb.jar"
    14:11:08,487 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-3) JNDI bindings for session bean named TestBeanImpl in deployment unit deployment "ejb-ejb.jar" are as follows:

        java:global/ejb-ejb/TestBeanImpl!ma.remote.TestBeanRemote
        java:app/ejb-ejb/TestBeanImpl!ma.remote.TestBeanRemote
        java:module/TestBeanImpl!ma.remote.TestBeanRemote
        java:jboss/exported/ejb-ejb/TestBeanImpl!ma.remote.TestBeanRemote
        java:global/ejb-ejb/TestBeanImpl
        java:app/ejb-ejb/TestBeanImpl
        java:module/TestBeanImpl

    14:11:08,534 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 1) JBAS018565: Replaced deployment "ejb-ejb.jar" with deployment "ejb-ejb.jar"
    14:14:54,209 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-7) JBAS015877: Stopped deployment ejb-war.war in 20ms
    14:14:54,209 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-5) JBAS015876: Starting deployment of "ejb-war.war"
    14:14:54,334 INFO  [org.jboss.web] (MSC service thread 1-5) JBAS018210: Registering web context: /ejb-war
    14:14:54,381 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 1) JBAS018565: Replaced deployment "ejb-war.war" with deployment "ejb-war.war"

調用ejb的MyServlet:

    package ma.remote;


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Hashtable;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ejbTester extends HttpServlet {


    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet ejbTester</title>");
            out.println("</head>");
            out.println("<body>");


            try {
                Hashtable<String, String> jndiProperties = new Hashtable<String, String>();
                jndiProperties.put("java.naming.factory.url.pkgs", "org.jboss.ejb.client.naming");
                InitialContext context = new InitialContext(jndiProperties);
                String viewClassName = TestBeanRemote.class.getName();
                TestBeanRemote fbr = (TestBeanRemote) context.lookup("ejb:ejb-ejb/TestBeanImpl!" + viewClassName);
                //TestBeanRemote fbr = (TestBeanRemote) context.lookup("java:global/ejb-ejb/TestBeanImpl!" + viewClassName);

                //this will be invoked correctly
                String bn = fbr.getStatus();

                // but this one causes an exception!
                DataCenter dc = fbr.getData();
                out.println("DataCenter: " + dc.Name);
                out.println("message" + bn);
            } catch (NamingException e) 
            {
                System.out.println("\n EJB-Exception: \n" + e);
            }
            out.println("</body>");
            out.println("</html>");
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

調用異常:localhost:8080 / ejb-war / ejbTester:

14:24:50,650 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/ejb-war].[ejbTester]] (http--127.0.0.1-8080-1) Servlet.service() for servlet ejbTester threw exception: java.lang.RuntimeException: IOException marshaling EJB parameters
    at org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:227) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:216) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.ejb3.remote.LocalEjbReceiver.processInvocation(LocalEjbReceiver.java:188) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:179) [jboss-ejb-client-1.0.5.Final.jar:1.0.5.Final]
    at org.jboss.ejb.client.TransactionInterceptor.handleInvocation(TransactionInterceptor.java:43) [jboss-ejb-client-1.0.5.Final.jar:1.0.5.Final]
    at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181) [jboss-ejb-client-1.0.5.Final.jar:1.0.5.Final]
    at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:128) [jboss-ejb-client-1.0.5.Final.jar:1.0.5.Final]
    at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181) [jboss-ejb-client-1.0.5.Final.jar:1.0.5.Final]
    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136) [jboss-ejb-client-1.0.5.Final.jar:1.0.5.Final]
    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121) [jboss-ejb-client-1.0.5.Final.jar:1.0.5.Final]
    at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104) [jboss-ejb-client-1.0.5.Final.jar:1.0.5.Final]
    at com.sun.proxy.$Proxy18.getData(Unknown Source)
    at ma.servlets.ejbTester.processRequest(ejbTester.java:42) [classes:]
    at ma.servlets.ejbTester.doGet(ejbTester.java:66) [classes:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
    at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_40]
Caused by: java.io.NotSerializableException: ma.remote.DataCenter
    at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:256)
    at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:135)
    at org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:225) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
    ... 28 more

有人知道我的代碼/結構出了什么問題並可以幫助我嗎?

謝謝!

您已經定義了Remote EJB ,這意味着您的目標是擁有一個分布式系統,在該系統中,您必須通過網絡將對象傳輸到另一個JVM 因此,您的POJO必須是可序列化的,因此ma.remote.DataCenter必須實現Serializable接口。

public class DataCenter implements Serializable {
    /** The serial version UID. */
    private static final long serialVersionUID = 1L;

    // attributes, getters and setters...

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM