2011-05-09 43 views
2

從頭開始一個新項目,轉換爲JPA,我的持久性提供者是EclipseLink,添加了必要的庫(eclipselink.jar,eclipselink.jar,javax.persistence,mysql-connector-java-5.1)。測試了連接,ping確定。然後創建一個新包New> JPA>來自表的實體>選定所有實體和密鑰生成器>標識。GWT RCP - SerializationException

GestorIpca.java

  GestorIpcaService.util.getInstance().getLista(new AsyncCallback<ArrayList<Docente>>() { 

       @Override 
       public void onFailure(Throwable caught) { 
        Window.alert("Erro na Ligacao efectuada"); 
        caught.getStackTrace(); 
       } 

       @Override 
       public void onSuccess(ArrayList<Docente> result) { 
        Window.alert("Ligacao efectuada com sucesso:" + result.size()); 
       } 
      });  

GestorIpcaService

@RemoteServiceRelativePath("greet") 
public interface GestorIpcaService extends RemoteService { 
    String greetServer(String name) throws IllegalArgumentException; 

    public static class util{ 
     public static GestorIpcaServiceAsync instance; 
     public static GestorIpcaServiceAsync getInstance(){ 
      if(instance == null){ 
       instance = GWT.create(GestorIpcaService.class); 
      } 
     return instance; 
     } 
    } 
    public ArrayList<Docente> getLista() throws IllegalArgumentException; 
}  

GestorIpcaServiceAsync

public interface GestorIpcaServiceAsync { 
     void greetServer(String input, AsyncCallback<String> callback) 
       throws IllegalArgumentException; 

     void getLista(AsyncCallback<ArrayList<Docente>> callback); 
    } 

GestorIpcaServiceImpl

@SuppressWarnings("serial") 
public class GestorIpcaServiceImpl extends RemoteServiceServlet implements 
     GestorIpcaService { 

    public ArrayList<Docente> getLista() throws IllegalArgumentException { 
     //Criamos um EntityManager 
     EntityManager em = JpaUtil.getEntityManagerFactory().createEntityManager(); 
     //Criamos a consulta 
     String consulta = "SELECT r from Docente r"; 
     //Executamos a consulta 
     Query q = em.createQuery(consulta); 
     ArrayList<Docente> lista = new ArrayList<Docente>(q.getResultList()); 
     return lista; 
    } 
/* public static void main(String args[]){ 
     GestorIpcaServiceImpl serviceImpl = new GestorIpcaServiceImpl(); 
     for (Docente docente : serviceImpl.getLista()){ 
      System.out.println("nome: " + docente.getNome()); 
     } 
    } 
    */ 

在這個文件中,我試圖爲運行> Java應用程序和控制檯給我2個記錄。 包com.GestorIpca.factory

import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 

public class JpaUtil { 
    private static final EntityManagerFactory emf; 
    //Método estático 
    static{ 
     //BLoco try 
     try 
     { 
      //Criação de EntityManagerFactory 
      emf = Persistence.createEntityManagerFactory("GestorIpca"); 
     }catch (Throwable e){ 
      //Controlar as excepções 
      System.err.println("A criação de SessionFactory falhou" + e); 
      e.printStackTrace(); 
      throw new ExceptionInInitializerError(e); 
     } 
    } 

    public static EntityManagerFactory getEntityManagerFactory(){ 
     return emf; 
    } 
}  

的persistence.xml自動創建。放在裏面META-INF

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="GestorIpca"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 

    <class>com.GestorIpca.shared.Ano</class> 
    <class>com.GestorIpca.shared.Categoria</class> 
    <class>com.GestorIpca.shared.Curso</class> 
    <class>com.GestorIpca.shared.Disciplina</class> 
    <class>com.GestorIpca.shared.Disponibilidade</class> 
    <class>com.GestorIpca.shared.Docente</class> 
    <class>com.GestorIpca.shared.Sala</class> 
    <class>com.GestorIpca.shared.Semestre</class> 
    <class>com.GestorIpca.shared.TipoCurso</class> 
    <class>com.GestorIpca.shared.Turma</class> 
    <class>com.GestorIpca.shared.User</class> 
     <properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/timetable"/> 
      <property name="javax.persistence.jdbc.user" value="root"/> 
      <property name="javax.persistence.jdbc.password" value="k771u3"/> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

最後一步>運行方式> Web應用程序 錯誤>無法連接到數據庫,並打印堆棧跟蹤在Eclipse控制檯

[EL Info]: 2011-05-09 10:03:08.78--ServerSession(8068087)--EclipseLink, version: Eclipse Persistence Services - 2.2.0.v20110202-r8913 
[EL Info]: 2011-05-09 10:03:09.297--ServerSession(8068087)--file:/C:/Users/Martinho/WorkSpace/GestorIpca/war/WEB-INF/classes/_GestorIpca login successful 
Starting Jetty on port 8888 
    [WARN] Exception while dispatching incoming RPC call 
com.google.gwt.user.client.rpc.SerializationException: java.lang.reflect.InvocationTargetException 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:764) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:727) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:616) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:152) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:534) 
    at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:616) 
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:474) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:571) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:324) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:746) 
    ... 30 more 
Caused by: com.google.gwt.user.client.rpc.SerializationException: Type 'org.eclipse.persistence.indirection.IndirectSet' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = {IndirectSet: not instantiated} 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:614) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:152) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:534) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeClass(ServerSerializationStreamWriter.java:704) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:734) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:616) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:152) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:534) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeClass(ServerSerializationStreamWriter.java:704) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:734) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:616) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:45) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:38) 
    ... 35 more 
[ERROR] 500 - POST /gestoripca/greet (127.0.0.1) 57 bytes 
    Request headers 
     Host: 127.0.0.1:8888 
     Connection: keep-alive 
     Referer: http://127.0.0.1:8888/GestorIpca.html?gwt.codesvr=127.0.0.1:9997 
     Content-Length: 132 
     Origin: http://127.0.0.1:8888 
     X-GWT-Module-Base: http://127.0.0.1:8888/gestoripca/ 
     X-GWT-Permutation: HostedMode 
     User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.30 Safari/534.30 
     Content-Type: text/x-gwt-rpc; charset=UTF-8 
     Accept: */* 
     Accept-Encoding: gzip,deflate,sdch 
     Accept-Language: pt-PT,pt;q=0.8,en-US;q=0.6,en;q=0.4 
     Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
    Response headers 
     Content-Type: text/plain  

注:我在改變包com.GestorIpca.shared從表

public class Ano implements Serializable 

生成的所有我的類

public class Ano implements IsSerializable  

也改變了我的GestorIpca.gwt.xml,並將此行結束

<extend-configuration-property name="rpc.blacklist" value="com.google.gwt.user.client.ui.*Collection"/> 
<extend-configuration-property name="rpc.blacklist" value="-.*List"/> 
<extend-configuration-property name="rpc.blacklist" value="-.*Map"/> 
<extend-configuration-property name="rpc.blacklist" value="-.*Collection"/> 
<extend-configuration-property name="rpc.blacklist" value="+java.util.HashMap"/> 
<extend-configuration-property name="rpc.blacklist" value="+java.util.LinkedHashMap"/> 
<extend-configuration-property name="rpc.blacklist" value="+java.util.ArrayList"/> 

我失去了什麼?

回答

1

我要看你的實體是如何定義的。也許有GWT RPC不喜歡的連接。在這種情況下,我建議創建DTO或實現RequestFactory

0

不知道你的實體是什麼樣子我會從異常猜測,原因可能是你的實體獲得如何通過你的持久性提供增強:

這意味着GWT RPC是什麼的時候了對象已準備好通過線路傳輸,但它實際上與編譯器認爲將要傳輸的對象不同,所以當試圖反序列化時,GWT RPC機制不再知道類型是什麼並拒絕對其進行反序列化。

引自:http://code.google.com/intl/de-DE/webtoolkit/articles/using_gwt_with_hibernate.html

那篇文章還提出瞭如何創建DTO的解決這個問題。

+0

所以我需要爲每個班級創建一個DTO?哦,我的上帝。這篇文章發表於2009年。兩年後他們仍然沒有解決這個問題? – Martinho 2011-05-09 15:21:18

+1

是的,他們做到了:他們構建了RequestFactory。 – 2011-05-09 15:55:01

0

我知道這是一個非常古老的問題,但我今晚遇到了這個確切的問題。

GWT序列化似乎不喜歡java.util.Set。我幾乎感覺到它讓java.util.Set和org.eclipse.persistence.indirection.IndirectSet混淆。

一旦我切換設置爲ArrayList,錯誤消失。