2012-03-02 18 views
13

यह थोड़ी देर हो गया है क्योंकि मैं जीडब्ल्यूटी कर रहा हूं और मुझे जल्दी कुछ करने की आवश्यकता है। मैंने चीजों को सेट अप किया है और अब मेरे पास एक आरपीसी है जो मुझे चाहिए, लेकिन यह विफल हो जाता है।जीडब्ल्यूटी - आरपीसी सीरियलाइजेशन एक्सेप्शन

आरपीसी मुझे एक ऐरेलिस्ट देना चाहता है, और रिक्ति # प्रोजेक्टनाम # .client.model में स्थित है। कॉल # projectname # .client.model में बनाया गया है।
मेरी सेवाओं के लिए इंटरफेस # प्रोजेक्ट # name.client.Service में हैं।
अंत में, पाठ्यक्रम की कॉल # प्रोजेक्टनाम #। सर्वर पर जाती है।
रिक्ति उपकरण IsSerializable है। अपवाद मैं अपने आरपीसी चलने से मिलता है निम्नलिखित:

Starting Jetty on port 8888 
[WARN] Exception while dispatching incoming RPC call 
com.google.gwt.user.client.rpc.SerializationException: Type 'firsteight.client.model.Vacancy' 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 = [email protected] 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619) 
    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:44) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:39) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:51) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:28) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:740) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:621) 
    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:153) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:539) 
    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) 

आरपीसी मैं कर रहा है निम्नलिखित:

void getVacs() { 
    try { 
     homeService.getVacancies(new AsyncCallback<ArrayList<Vacancy>>() { 
      public void onFailure(Throwable caught) 
      { 
       RootPanel.get("grayblock").add(new HTML("Failed:" + caught.getMessage())); 
      } 

      public void onSuccess(ArrayList<Vacancy> result) 
      { 
       RootPanel.get("grayblock").add(new HTML(result.get(0).getTitle())); 
      } 
     }); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

मैंने सोचा कि मैं सब मैं रिक्त Serializable बनाने के लिए आवश्यक किया था, और एक ArrayList आरपीसी के लिए रिटर्नटाइप के रूप में रिक्ति की रिक्ति के रूप में रिक्ति के रूप में गिना जाता है .. सही? मैं क्या गलत कर रहा हूं?

अग्रिम धन्यवाद!

+0

आप सुनिश्चित करें कि आप 'implement'ed अपने' Vacancy' कक्षा में 'com.google.gwt.user.client.rpc.IsSerializable' कर रहे हैं? –

+1

'आयात com.google.gwt.user.client.rpc.IsSerializable;' 'सार्वजनिक वर्ग रिक्त IsSerializable लागू करता है {' बिल्कुल। –

उत्तर

30

यह आमतौर पर एक गैर-धारावाहिक वर्ग का उपयोग करके होता है, जो तब हो सकता है जब आपकी कक्षा com.google.gwt.user.client.rpc.IsSerializable लागू नहीं करती है या यदि आप खाली कन्स्ट्रक्टर जोड़ना भूल गए हैं।

एक सेम आप (GWT साइट से) निम्न आवश्यकताओं को पूरा करने के लिए है पारित करने के लिए:

  1. यह लागू करता है या तो जावा Serializable या GWT IsSerializable इंटरफेस, या तो सीधे, या क्योंकि यह एक सुपर क्लास से निकला है कि कर देता है।
  2. इसकी गैर अंतिम, गैर क्षणिक दृष्टांत फ़ील्ड खुद को कर रहे हैं serializable
  3. यह किसी भी पहुँच संशोधक के साथ एक डिफ़ॉल्ट (शून्य तर्क) निर्माता (जैसे निजी फू() {} काम करेंगे) है

यहां तक ​​कि अगर आप को पूरा इन आवश्यकताओं को हो सकता है GWT संकलक का कहना है कि:

प्रकार जो इस SerializationPolicy द्वारा धारावाहिक या उसके क्लास वस्तुनहीं कर सकता हो सकता है के सेट में शामिल नहीं किया गयालोड किया जाना चाहिए। सुरक्षा उद्देश्यों के लिए, इस प्रकार को क्रमबद्ध नहीं किया जाएगा .: उदाहरण = @

समस्या के कई कारण हो सकते हैं।

  1. सत्यापित करें वर्ग एक डिफ़ॉल्ट निर्माता है कि (तर्क के बिना)
  2. सत्यापित करें कि वर्ग Serializable लागू करता है या IsSerializable या एक अंतरफलक है कि Serializable फैली लागू करता है: यहाँ अपने एक पूरी जांच सूची समस्या को हल करने के लिए उपयोग करने के लिए या कक्षा को लागू करता है जो Serializable
  3. सत्यापित करें कि क्लास क्लाइंट में है। * पैकेज या ...
  4. सत्यापित करें कि कक्षा क्लाइंट में नहीं है।* पैकेज, जिसे में आपके जीडब्ल्यूटी एक्सएमएल मॉड्यूल परिभाषा में संकलित किया गया है। डिफ़ॉल्ट रूप से मौजूद है। यदि आपकी कक्षा किसी अन्य पैकेज में है तो आपको इसे स्रोत में जोड़ना होगा। उदाहरण के लिए यदि आपकी कक्षा डोमेन के अंतर्गत है। * आपको इसे xml में जोड़ना चाहिए। ध्यान रखें कि कक्षा सर्वर पैकेज से संबंधित नहीं हो सकता है! जीडब्ल्यूटी पृष्ठ पर अधिक जानकारी: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  5. यदि आप किसी अन्य जीडब्ल्यूटी परियोजना से कक्षा को शामिल कर रहे हैं तो आपको अपने xml मॉड्यूल परिभाषा में विरासत जोड़ें। उदाहरण के लिए यदि आपका क्लास फू पैकेज com.ummy.domain में है, तो आपको मॉड्यूल परिभाषा में जोड़ना होगा। अधिक यहाँ विवरण: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  6. आप के रूप में जारी एक और GWT परियोजना से कक्षा एक जार सत्यापित करें कि जार भी स्रोत कोड शामिल सहित रहे हैं क्योंकि GWT recompile भी ग्राहक के लिए पारित किया कक्षाओं के लिए जावा स्रोत।

पीएस: http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/ से कॉपी किया गया क्योंकि साइट वर्तमान में अनुपलब्ध है। यदि आप मूल लेख को पढ़ना चाहते हैं तो इसे उपर्युक्त यूआरएल का उपयोग करके Google से खोजें और इसे Google वेब कैश से पढ़ें।

+1

मैंने निम्नलिखित कन्स्ट्रक्टर शामिल किया है: 'सार्वजनिक रिक्ति() {}'। उद्देश्य यह है कि मैं सर्वर से पुनः प्राप्त के साथ वर्तमान में एक पैरामिट्रीकृत निर्माता का उपयोग करता है, लेकिन मुझे नहीं लगता कि कोई फर्क चाहिए .. है (?) –

+0

आप अपने वर्ग जो RemoteService इंटरफेस और हस्तांतरण वस्तु रिक्त –

+0

सर्वर साइड कार्यान्वयन को लागू करता है साझा कर सकते हैं, डेमो डेटा: http://pastebin.com/f88rMZEJ सेवा: http://pastebin.com/Yt8piq1m Async: http://pastebin.com/Lbuav4yr –

6

इस निष्कासन के लिए अहंसर कारण ब्राउज़र पक्ष पर पुराना जावास्क्रिप्ट था। मुझे कोड को हार्ड रीलोड (CTRL + F5) करना पड़ा था और यह अपवाद समाप्त हो गया था।

return myList.subList(fromIndex, toIndex); 
0

मैं भी इस त्रुटि जब मैं sublist इस्तेमाल किया मिलता है। मुझे परियोजना (मेवेन -> अपडेट प्रोजेक्ट) का पुनर्निर्माण करना पड़ा और फिर यह काम किया।

+0

को -noincremental विकल्प प्रदान कर यह काम करता है अगर आप परीक्षण 'लौट myList' से काम कर रहा है? 'sublist' वापस लौटा प्रकार नहीं बदलना चाहिए। –

+0

MyList बदल गया था, लेकिन मैं sublist प्राप्त करना चाहता था, इसलिए मैं के साथ यह किया पाश के लिए (जावा 7) – paka

0

मेरे मामले में मेरे target फ़ोल्डर में कुछ पुराने कैश है जो ठीक से अपडेट नहीं किए जाने है:

संबंधित मुद्दे