2011-09-19 7 views
8

Intento usar la api de Blobstore para appengine usando GWT ... ¡Te lo prometo! Lo tuve trabajando durante meses y de repente comencé obtengo los siguientes errores ... después de ejecutar la siguiente línea desde un servelet.Error de GWT Blobstore llamando a createUploadUrl()

ImageServiceImpl clase pública se extiende 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"; 

. . . . . // omite por razones de brevedad }

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

}

Inicializando la aplicación servidor del motor de 19 de Sep, 2011 7:28:45 PM información com.google.apphosting.utils.jetty.JettyLogger INFORMACIÓN: Inicio de sesión en JettyLogger (nulo) a través de com.google.apphosting.utils.jetty.JettyLogger 19 de septiembre de 2011 7:28:45 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml INFORMACIÓN: procesado con éxito C: \ development \ n5 \ n5 \ war \ WEB-INF/appengine-web.xml 19 de septiembre de 2011 7:28:45 PM com.google.apph osting.utils.config.AbstractConfigXmlReader readConfigXml INFORMACIÓN: Procesado correctamente C: \ desarrollo \ n5 \ n5 \ war \ WEB-INF/web.xml 19 de septiembre de 2011 3:28:47 PM com.google.appengine.tools. development.DevAppServerImpl comenzar INFORMACIÓN: El servidor está funcionando a http://localhost:8888/ 19 de Sep, 2011 7:34:59 PM com.google.appengine.tools.development.ApiProxyLocalImpl ingrese GRAVES: javax.servlet.ServletContext log: excepción al despachar entrante Llamada a RPC com.google.gwt.user.server.rpc.UnexpectedException: método de servicio 'public abstract java.lang.String com.six.n5.client.service.ImageService.getUpLoadPath()' lanzó una excepción inesperada: java. lang.VerifyError: class com.google.appengine.api.blobstore.BlobstoreServicePb $ CreateUploadURLRequest reemplaza el método final isInitialized.() Z en com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure (RPC.java:385) en com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:588) en com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall (RemoteServiceServlet.java:208) en com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost (RemoteServiceServlet.java:248) en com. google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost (AbstractRemoteServiceServlet.java:62) en javax.servlet.http.HttpServlet.service (HttpServlet.java:637) en javax.servlet.http.HttpServlet.service (HttpServlet.java:717) en com.google.inject.servlet.ServletDefinition.doService (ServletDefinition.java:216) en com.google.inject.servlet.ServletDefinition.service (ServletDefinition.java:141) en com.google.inject.servlet.ManagedServletPipeline.service (ManagedServletPipeline.java:93) en com.google.inject.servlet.FilterChainInvocation.doFilter (FilterChainInvocation.java:63) en COM. google.inject.servlet.ManagedFilterPipeline.dispatch (ManagedFilterPipeline.java:122) en com.google.inject.servlet.GuiceFilter.doFilter (GuiceFilter.java:110) en org.mortbay.jetty.servlet.ServletHandler $ CachedChain. doFilter (ServletHandler.java:1157) en com.google.appengine.tools.development.HeaderVerificationFilter.doFilter (HeaderVerificationFilter.java:35) en org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java: 1157) en com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter (ServeBlobFilter.java:58) en org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) en com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter (TransactionCleanupFilter.java: 43) en org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) en com.google.appengine.tools.development.StaticFileFilter.doFilter (StaticFileFilter.java:122) en org. mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) en com.google.appengine.tools.development.BackendServersFilter.doFilter (BackendServersFilter.java:97) en org.mortbay.jetty.servlet. ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) en org.mortbay.jetty.servlet.Servl etHandler.handle (ServletHandler.java:388) en org.mortbay.jetty.security.SecurityHandler.handle (SecurityHandler.java:216) en org.mortbay.jetty.servlet.SessionHandler.handle (SessionHandler.java:182) en org.mortbay.jetty.handler.ContextHandler.handle (ContextHandler.java:765) en org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java:418) en com.google.apphosting.utils. jetty.DevAppEngineWebAppContext.handle (DevAppEngineWebAppContext.java:70) en org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152) en com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle (JettyContainerService.java:351) en org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152) en org.mortbay.jetty.Server.handle (Server.java:326) en org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java:542) en org.mortbay.jetty.HttpConnection $ RequestHandler.content (HttpConnection.java:938) en org.mortbay.jetty.HttpParser.parseNext (HttpParser.java:755) en org.mortbay.jetty.HttpParser.parseAvailable (HttpParser.java:218) en org.mortbay.jetty. HttpConnection.handle (HttpConnection.java:404) en org.mortbay.io.nio.SelectChannelEndPoint.run (SelectChannelEndPoint.java:409) en org.mortbay.thread.QueuedThreadPool $ PoolThread.run (QueuedThreadPool.java:582) Causado por: java.lang.VerifyError: class com.google.appengine.api.blobstore.BlobstoreServicePb $ CreateUploadURLRequest reemplaza el método final isIniti alized.() Z en java.lang.ClassLoader.defineClass1 (Nativo Método) en java.lang.ClassLoader.defineClass (origen desconocido) en java.security.SecureClassLoader.defineClass (origen desconocido) en java.net. URLClassLoader.defineClass (origen desconocido) en java.net.URLClassLoader.access $ 100 (origen desconocido) en java.net.URLClassLoader $ 1.run (origen desconocido) en java.net.URLClassLoader $ 1.run (origen desconocido) en java.security.AccessController.doPrivileged (método nativo) en java.net.URLClassLoader.findClass (origen desconocido) en java.lang.ClassLoader.loadClass (origen desconocido) en com.google.appengine.tools.development. IsolatedAppClassLoader.loadClass (IsolatedA ppClassLoader.java:176) en java.lang.ClassLoader.loadClass (origen desconocido) en com.google.appengine.api.blobstore.BlobstoreServiceImpl.createUploadUrl (BlobstoreServiceImpl.java:43) en com.google.appengine.api .blobstore.BlobstoreServiceImpl.createUploadUrl (BlobstoreServiceImpl.java:34) en com.six.n5.server.ImageServiceImpl.getUpLoadPath (ImageServiceImpl.java:153) en sun.reflect.NativeMethodAccessorImpl.invoke0 (Método nativo) al sol. reflect.NativeMethodAccessorImpl.invoke (Fuente desconocida) en sun.reflect.DelegatingMethodAccessorImpl.invoke (Fuente desconocida) en java.lang.reflect.Method.invoke (Fuente desconocida) en com.google.appengine.tools.development.agent .runtime.Runtime.invoke (Runtime.java: 100) en com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:569) ... 39 más

Respuesta

12

he encontrado mi propio error! como resultó, la razón por la que esto falló repentinamente fue porque la publicación de FORMULARIO pensó que se trataba de una publicación de dominio cruzado. Estaba probando el sitio web llamando a 127.0.0.1:8888..etc, pero cuando se llamó a mi RPC de imagen para establecer la ruta de carga, volvió al formulario setAction el nombre de mi máquina kmoore-PC: 8888..etc en su lugar del 127.0.0.1:8888 ... y por lo tanto, devolvió nulo porque creía que estaba cruzando dominios.

Para revisión, haga clic en el cuadro de Google en la barra de URL y añadir el nombre del equipo y luego probar que la aplicación usando el nombre del equipo en lugar de 127

0

Probé la sustitución de host local con el nombre de la máquina que no ayudó, pero es un problema de dominio cruzado de JavaScript, así que traté de usar el patrón de URL asignado en el web xml y obtuve un resultado de cadena. El resultado es mi respuesta envuelta en XML y planeo analizarla. si alguien tiene algo más elegante, por favor dígame.

aquí es la cadena de respuesta [se ve un poco diferente, ya que afecta a la página de desbordamiento de pila]:

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

Aquí es el código del servidor correspondiente

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; 

} 

Aquí está el código de cliente relevante , no hay necesidad de analizar aquí es el código del lado del servidor:

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()); 
      } 

     } 

    }); 

Editar He encontrado una forma más elegante para ofrecer una larga Identificación del

//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

En lugar de utilizar el nombre del equipo, simplemente sustituirla por la dirección 127 en el modo dev, así:

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"); 
} 
Cuestiones relacionadas