Ich bin versucht, die Blobstore API für Appengine mit GWT zu verwenden ... Ich verspreche es dir! Ich hatte es monatelang in Betrieb und plötzlich fing ich an Erhalte die folgenden Fehler .. nach dem Ausführen der folgenden Zeile von ein Servelet.
Öffentliche Klasse ImageServiceImpl erweitert RemoteServiceServlet implementiert ImageService {
%Vor%. . . . . // der Kürze halber weggelassen }
%Vor%}
Initialisierung des App Engine-Servers Sep 19, 2011 7:28:45 PM com.google.apphosting.utils.jetty.JettyLogger info INFO: Anmelden bei JettyLogger (null) über com.google.apphosting.utils.jetty.JettyLogger Sep 19, 2011 7:28:45 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml INFO: Erfolgreich verarbeitet C: \ Entwicklung \ n5 \ n5 \ war \ WEB-INF / appengine-web.xml Sep 19, 2011 7:28:45 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml INFO: Erfolgreich verarbeitet C: \ Entwicklung \ n5 \ n5 \ war \ WEB-INF / web.xml Sep 19, 2011 3:28:47 PM com.google.appengine.tools.development.DevAppServerImpl starten INFO: Der Server läuft unter Ссылка Sep 19, 2011 7:34:59 PM com.google.appengine.tools.development.ApiProxyLocalImpl log SEVERE: javax.servlet.ServletContext-Protokoll: Ausnahme beim Senden eines eingehenden RPC-Aufrufs com.google.gwt.user.server.rpc.UnexpectedException: Die Servicemethode 'public abstract java.lang.String com.six.n5.client.service.ImageService.getUpLoadPath ()' hat eine unerwartete Ausnahme ausgelöst: java.lang.VerifyError : class com.google.appengine.api.blobstore.BlobstoreServicePb $ CreateUploadURLRequest überschreibt die finale Methode isInitialized. () Z unter com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure (RPC.java:385) unter com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:588) unter com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall (RemoteServiceServlet.java:208) unter com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost (RemoteServiceServlet.java:248) unter com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost (AbstractRemoteServiceServlet.java:62) bei javax.servlet.http.HttpServlet.service (HttpServlet.java:637) bei javax.servlet.http.HttpServlet.service (HttpServlet.java:717) unter com.google.inject.servlet.ServletDefinition.doService (ServletDefinition.java:216) unter com.google.inject.servlet.ServletDefinition.service (ServletDefinition.java:141) unter com.google.inject.servlet.ManagedServletPipeline.service (ManagedServletPipeline.java:93) unter com.google.inject.servlet.FilterChainInvocation.doFilter (FilterChainInvocation.java:63) unter com.google.inject.servlet.ManagedFilterPipeline.dispatch (ManagedFilterPipeline.java:122) bei com.google.inject.servlet.GuiceFilter.doFilter (GuiceFilter.java:110) bei org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) unter com.google.appengine.tools.development.HeaderVerificationFilter.doFilter (HeaderVerificationFilter.java:35) bei org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) bei com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter (ServeBlobFilter.java:58) bei org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) unter com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter (TransactionCleanupFilter.java:43) bei org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) unter com.google.appengine.tools.development.StaticFileFilter.doFilter (StaticFileFilter.java:122) bei org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) bei com.google.appengine.tools.development.BackendServersFilter.doFilter (BackendServersFilter.java:97) bei org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) bei org.mortbay.jetty.servlet.ServletHandler.handle (ServletHandler.java:388) bei org.mortbay.jetty.security.SecurityHandler.handle (SecurityHandler.java:216) bei org.mortbay.jetty.servlet.SessionHandler.handle (SessionHandler.java:182) bei org.mortbay.jetty.handler.ContextHandler.handle (ContextHandler.java:765) unter org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java:418) unter com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle (DevAppEngineWebAppContext.java:70) bei org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152) bei com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle (JettyContainerService.java:351) bei org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152) bei org.mortbay.jetty.Server.handle (Server.java:326) bei org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java:542) bei org.mortbay.jetty.HttpConnection $ RequestHandler.content (HttpConnection.java:938) bei org.mortbay.jetty.HttpParser.ParseNext (HttpParser.java:755) bei org.mortbay.jetty.HttpParser.parseAvailable (HttpParser.java:218) bei org.mortbay.jetty.HttpConnection.handle (HttpConnection.java:404) unter org.mortbay.io.nio.SelectChannelEndPoint.run (SelectChannelEndPoint.java:409) bei org.mortbay.thread.QueuedThreadPool $ PoolThread.run (QueuedThreadPool.java:582) Verursacht von: java.lang.VerifyError: class com.google.appengine.api.blobstore.BlobstoreServicePb $ CreateUploadURLRequest überschreibt die finale Methode isInitialized. () Z bei java.lang.ClassLoader.defineClass1 (native Methode) bei java.lang.ClassLoader.defineClass (unbekannte Quelle) bei java.security.SecureClassLoader.defineClass (unbekannte Quelle) bei java.net.URLClassLoader.defineClass (unbekannte Quelle) bei java.net.URLClassLoader.access $ 100 (unbekannte Quelle) bei java.net.URLClassLoader $ 1.run (Unbekannte Quelle) bei java.net.URLClassLoader $ 1.run (Unbekannte Quelle) bei java.security.AccessController.doPrivileged (Native Methode) bei java.net.URLClassLoader.findClass (unbekannte Quelle) bei java.lang.ClassLoader.loadClass (unbekannte Quelle) unter com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass (IsolatedAppClassLoader.java:176) bei java.lang.ClassLoader.loadClass (unbekannte Quelle) unter com.google.appengine.api.blobstore.BlobstoreServiceImpl.createUploadUrl (BlobstoreServiceImpl.java:43) unter com.google.appengine.api.blobstore.BlobstoreServiceImpl.createUploadUrl (BlobstoreServiceImpl.java:34) unter com.six.n5.server.ImageServiceImpl.getUpLoadPath (ImageServiceImpl.java:153) bei sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Methode) bei sun.reflect.NativeMethodAccessorImpl.invoke (Unbekannte Quelle) bei sun.reflect.DelegatingMethodAccessorImpl.invoke (Unbekannte Quelle) at java.lang.reflect.Method.invoke (Unbekannte Quelle) bei com.google.appengine.tools.development.agent.runtime.Runtime.invoke (Runtime.java:100) unter com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:569) ... 39 mehr
Ich habe meinen eigenen Fehler gefunden! Es stellte sich heraus, dass der Grund für das plötzliche Scheitern darin lag, dass der FORM-Post dachte, dass es sich um ein Cross-Domain-Posting handelte. Ich habe die Website getestet, indem ich 127.0.0.1:8888..etc aufgerufen habe, aber als mein Image-RPC aufgerufen wurde, um den Upload-Pfad zu erstellen, kehrte es zum Formular setAction zurück, das stattdessen den Namen meines Rechners kmoore-PC: 8888..etc hatte von 127.0.0.1:8888 ... und deshalb gab es null zurück, weil es dachte, dass es Domänen kreuzte.
Um zu beheben, klicken Sie auf das Google-Feld in der URL-Leiste und fügen Sie Ihren Computernamen hinzu und testen Sie dann Ihre App mit dem Computernamen anstelle von 127
Ich habe versucht, den lokalen Host durch den Namen der Maschine zu ersetzen, aber es ist ein domainübergreifendes Java-Script-Problem, also habe ich einfach versucht, das im XML-Muster zugewiesene URL-Muster zu verwenden. Das Ergebnis ist meine Antwort mit XML verpackt und ich plane, es zu analysieren. Wenn jemand etwas Eleganteres hat, sag es mir bitte.
Hier ist der Antwort-String [sieht etwas anders aus, weil er die Stack-Überlaufseite betrifft]:
pre style="Zeilenumbruch: Break-Word; Leerstelle: Pre-Wrap;" & gt; meine Antwort ID
Hier ist der relevante Servercode
public void doPost (HttpServletRequest-Anforderung, HttpServletResponse-Antwort) löst & gt; ServletException, IOException aus { // Redirect rekursiv zu diesem Servlet (Aufrufe doGet) response.sendRedirect ("/ blobstoreexample / uploadservice? id=" + & gt; item_image_blob_key); } }
%Vor%
Hier ist der relevante Client-Code, hier ist kein serverseitiger Code erforderlich:
%Vor%Edit Ich fand einen eleganteren Weg, eine lange ID zu liefern
%Vor%Anstatt den Computernamen zu verwenden, ersetze ich ihn im Dev-Modus einfach durch die 127-Adresse:
%Vor%