2016-03-11 6 views
0

Iam пытается вызвать ejb из другого веб-приложения (особенно Servlet) и оба размещены на одном JBoss AppServer.IOException маршалинг Параметры EJB

В первый раз это выглядит хорошо, если я вызываю ejb-методы со String/integer return-values ​​/ types ... Но если я вызову методы с пользовательскими типами возвращаемых данных, тогда я получу «параметры EJB для маршалинга IOException», хотя определение пользовательского класса на Доступно "WEB-INF/Lib /" ... Я думаю, что его небольшая проблема с большим эффектом :-(

EJB структуры проекта: enter image description here веб-приложение структуры проекта enter image description here

удаленные классы ejb связаны также с веб-приложением

Пульт дистанционного управления:

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" 

MyServlet который вызывает EJB:

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> 

} 

Exception по телефону: локального хоста: 8080/EJB войны/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 

ли кто-нибудь знает, что это неправильно в моем коде/структуре и может помочь меня?

Спасибо!

ответ

1

Вы определили 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... 

} 
Смежные вопросы