2011-09-19 11 views
8

Sto tentando di utilizzare l'API Blobstore per appengine usando GWT ... Ti prometto! L'ho fatto funzionare per mesi e improvvisamente ho iniziato ottenere i seguenti errori .. arfter eseguendo la riga seguente da un servelet.GWT Blobstore errore di chiamata createUploadUrl()

public class ImageServiceImpl estende RemoteServiceServlet implementa ImageService {

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

    // init the blog store service 
private BlobstoreService blobService = BlobstoreServiceFactory.getBlobstoreService(); 
    //private static final Logger log = Logger.getLogger(ImageServiceImpl.class); 
    public static final String PATH_TO_DEFAULT_IMAGE = "images/no_photo.jpg"; 

. . . . . // omesse per brevità }

@Override 
    public String getUpLoadPath() { 
     String url = blobService.createUploadUrl("/n5/doimage"); 
     return url; 
    } 

}

inizializzazione App Engine server di 19 settembre 2011 19:28:45 com.google.apphosting.utils.jetty.JettyLogger informazioni INFO: Accesso a JettyLogger (null) tramite com.google.apphosting.utils.jetty.JettyLogger set 19, 2011 7:28:45 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml INFO: Elaborazione C: \ elaborata con successo \ n5 \ n5 \ war \ WEB-INF/appengine-web.xml set 19, 2011 7:28:45 PM com.google.apph osting.utils.config.AbstractConfigXmlReader readConfigXml INFO: Elaborato con successo C: \ development \ n5 \ n5 \ war \ WEB-INF/web.xml set 19, 2011 3:28:47 PM com.google.appengine.tools. development.DevAppServerImpl iniziare INFORMAZIONI: Il server è in esecuzione a http://localhost:8888/ 19 set 2011 19:34:59 com.google.appengine.tools.development.ApiProxyLocalImpl login GRAVI: javax.servlet.ServletContext login: eccezione durante dispacciamento in entrata Chiamata RPC com.google.gwt.user.server.rpc.UnexpectedException: metodo di servizio 'public abstract java.lang.String com.six.n5.client.service.ImageService.getUpLoadPath()' ha generato un'eccezione imprevista: java. lang.VerifyError: class com.google.appengine.api.blobstore.BlobstoreServicePb $ CreateUploadURLRequest esegue l'override del metodo finale isInitialized.() Z all'indirizzo com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure (RPC.java:385) all'indirizzo com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:588) presso com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall (RemoteServiceServlet.java:208) all'indirizzo com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost (RemoteServiceServlet.java:248) presso com. google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost (AbstractRemoteServiceServlet.java:62) all'indirizzo javax.servlet.http.HttpServlet.service (HttpServlet.java:637) all'indirizzo javax.servlet.http.HttpServlet.service (HttpServlet.java:717) all'indirizzo com.google.inject.servlet.ServletDefinition.doService (ServletDefinition.java:216) all'indirizzo com.google.inject.servlet.ServletDefinition.service (ServletDefinition.java:141) a com.google.inject.servlet.ManagedServletPipeline.service (ManagedServletPipeline.java:93) a com.google.inject.servlet.FilterChainInvocation.doFilter (FilterChainInvocation.java:63) in com. google.inject.servlet.ManagedFilterPipeline.dispatch (ManagedFilterPipeline.java:122) in com.google.inject.servlet.GuiceFilter.doFilter (GuiceFilter.java:110) in org.mortbay.jetty.servlet.ServletHandler $ cache in cache. doFilter (ServletHandler.java:1157) su com.google.appengine.tools.development.HeaderVerificationFilter.doFilter (HeaderVerificationFilter.java:35) all'indirizzo org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java: 1157) all'indirizzo com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter (ServeBlobFilter.java:58) all'indirizzo org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) su com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter (TransactionCleanupFilter.java: 43) a org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) a com.google.appengine.tools.development.StaticFileFilter.doFilter (StaticFileFilter.java:122) a org. mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) all'indirizzo com.google.appengine.tools.development.BackendServersFilter.doFilter (BackendServersFilter.java:97) all'indirizzo org.mortbay.jetty.servlet. ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) all'indirizzo org.mortbay.jetty.servlet.Servl etHandler.handle (ServletHandler.java:388) all'indirizzo org.mortbay.jetty.security.SecurityHandler.handle (SecurityHandler.java:216) all'indirizzo org.mortbay.jetty.servlet.SessionHandler.handle (SessionHandler.java:182) all'indirizzo org.mortbay.jetty.handler.ContextHandler.handle (ContextHandler.java:765) all'indirizzo org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java:418) su com.google.apphosting.utils. jetty.DevAppEngineWebAppContext.handle (DevAppEngineWebAppContext.java:70) all'indirizzo org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152) su com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle (JettyContainerService.java:351) all'indirizzo org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152) in org.mortbay.jetty.Server.handle (Server.java:326) in org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java:542) all'indirizzo org.mortbay.jetty.HttpConnection $ RequestHandler.content (HttpConnection.java:938) all'indirizzo org.mortbay.jetty.HttpParser.parseNext (HttpParser.java:755) all'indirizzo org.mortbay.jetty.HttpParser.parseAvailable (HttpParser.java:218) all'indirizzo org.mortbay.jetty. HttpConnection.handle (HttpConnection.java:404) all'indirizzo org.mortbay.io.nio.SelectChannelEndPoint.run (SelectChannelEndPoint.java:409) all'indirizzo org.mortbay.thread.QueuedThreadPool $ PoolThread.run (QueuedThreadPool.java:582) Causato da: java.lang.VerifyError: classe com.google.appengine.api.blobstore.BlobstoreServicePb $ CreateUploadURLRequest esegue l'override del metodo finale isIniti alized.() Z a java.lang.ClassLoader.defineClass1 (metodo natale) a java.lang.ClassLoader.defineClass (fonte sconosciuta) a java.security.SecureClassLoader.defineClass (fonte sconosciuta) a java.net. URLClassLoader.defineClass (fonte sconosciuta) a java.net.URLClassLoader.access $ 100 (Fonte sconosciuta) a java.net.URLClassLoader $ 1.run (Fonte sconosciuta) a java.net.URLClassLoader $ 1.run (Fonte sconosciuta) a java.security.AccessController.doPrivileged (metodo nativo) su java.net.URLClassLoader.findClass (sorgente sconosciuta) a java.lang.ClassLoader.loadClass (sorgente sconosciuta) su com.google.appengine.tools.development. IsolatedAppClassLoader.loadClass (IsolatedA ppClassLoader.java:176) a java.lang.ClassLoader.loadClass (fonte sconosciuta) a com.google.appengine.api.blobstore.BlobstoreServiceImpl.createUploadUrl (BlobstoreServiceImpl.java:43) a com.google.appengine.api .blobstore.BlobstoreServiceImpl.createUploadUrl (BlobstoreServiceImpl.java:34) a com.six.n5.server.ImageServiceImpl.getUpLoadPath (ImageServiceImpl.java:153) a sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo natale) al sole. reflect.NativeMethodAccessorImpl.invoke (sorgente sconosciuta) su sun.reflect.DelegatingMethodAccessorImpl.invoke (sorgente sconosciuta) su java.lang.reflect.Method.invoke (fonte sconosciuta) su com.google.appengine.tools.development.agent .runtime.Runtime.invoke (runtime.java: 100) a com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:569) ... more 39

risposta

12

ho trovato il mio errore! dato che il motivo per cui questo è stato improvvisamente fallito è perché il post di FORM ha pensato che si trattasse di un dominio incrociato. Stavo testando il sito Web chiamando 127.0.0.1:8888..etc ma quando il mio RPC di immagine è stato chiamato per stabilire il percorso di upload, è tornato al form setAction il nome della mia macchina kmoore-PC: 8888..etc invece di 127.0.0.1:8888 ... e quindi ha restituito null perché pensava che stessero incrociando i domini.

Per correzione, fare clic sulla casella di Google nella barra URL e aggiungere il nome del computer e poi provarvi applicazione utilizzando il nome del computer, invece di 127

0

Ho provato a sostituire host locale con il nome della macchina non ha aiutato, ma si tratta di un problema di java-script su più domini, quindi ho provato a utilizzare solo il pattern URL assegnato nel web xml e ho ottenuto un risultato String. Il risultato è la mia risposta con XML e ho intenzione di analizzarlo. se qualcuno ha qualcosa di più elegante, per favore dimmelo

qui è la stringa di risposta [sembra un po 'diverso, perché influisce sulla pagina di overflow dello stack]:

pre style="word-wrap: break-word; white-space: pre-wrap;">my response id

Ecco il codice del server in questione

public void doPost(HttpServletRequest request, HttpServletResponse response) throws >ServletException, IOException { //Redirect recursively to this servlet (calls doGet) response.sendRedirect("/blobstoreexample/uploadservice?id=" + >item_image_blob_key); } }

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException 
{ 
    System.out.println("shonka"); 
    //Send the meta-data id back to the client in the HttpServletResponse response 
    String id = req.getParameter("id"); 

    response.getWriter().write(id); 
    return; 

} 

Ecco il codice client in questione , non c'è bisogno di analizzare qui il codice lato server:

uploadForm.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { 
     @Override 
     public void onSubmitComplete(SubmitCompleteEvent event) { 

     //The submit complete Event Results will contain the unique 
     //identifier for the picture's meta-data. Trim it to remove 
     //trailing spaces and line breaks 
      System.out.println("uploadForm onSubmitComplete() results are: " + event.getResults()); 

      Window.alert(event.getResults()); 
      if(event.getResults() != null) 
      { 
      // getPicture(event.getResults().trim()); 
      } 
      else 
      { 
       Window.alert(event.getResults()); 
      } 

     } 

    }); 

Modifica Ho trovato un modo più elegante per fornire un lungo id

//Redirect recursively to this servlet (calls doGet) 
     response.sendRedirect("/itemmanager/receive?id=" + item.getKey().getId()); 
     } 

     @Override 
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
     { 
      System.out.println("entered do post"); 
     //Send the meta-data id back to the client in the HttpServletResponse response 
     String id = req.getParameter("id"); 
     System.out.println("entered do post id is: " + id); 
     resp.setHeader("Content-Type", "text/html"); 
     resp.getWriter().println(id); 

     } 
0

Invece di usare il nome del computer, ho semplicemente sostituirlo con l'indirizzo 127 in modalità dev, in questo modo:

String url = blobstoreService.createUploadUrl("/project/uploadservice"); 

// change the computer name to standard localhost ip address, if in dev mode 
if(SystemProperty.environment.value() == SystemProperty.Environment.Value.Development) 
{ 
    url = url.replace("Your-PC-Name", "127.0.0.1"); 
} 
Problemi correlati