【问题标题】:GWT Blobstore error calling createUploadUrl()GWT Blobstore 错误调用 createUploadUrl()
【发布时间】:2011-09-19 19:45:44
【问题描述】:

我正在尝试使用 GWT 将 Blobstore api 用于 appengine... 我答应你!我让它工作了几个月,突然我开始了 得到以下错误..在执行以下行之后 一个小服务程序。

公共类 ImageServiceImpl 扩展 RemoteServiceServlet 实现 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";

。 . . . . // 为简洁省略 }

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

}

正在初始化 App Engine 服务器 2011 年 9 月 19 日晚上 7:28:45 com.google.apphosting.utils.jetty.JettyLogger 信息 信息:通过 com.google.apphosting.utils.jetty.JettyLogger 记录到 JettyLogger(null) 2011 年 9 月 19 日晚上 7:28:45 com.google.apphosting.utils.config.AppEngineWebXmlReader 读取AppEngineWebXml INFO: 成功处理 C:\development\n5\n5\war\WEB-INF/appengine-web.xml 2011 年 9 月 19 日晚上 7:28:45 com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml INFO: 成功处理 C:\development\n5\n5\war\WEB-INF/web.xml 2011 年 9 月 19 日下午 3:28:47 com.google.appengine.tools.development.DevAppServerImpl 开始 信息:服务器在http://localhost:8888/ 运行 2011 年 9 月 19 日晚上 7:34:59 com.google.appengine.tools.development.ApiProxyLocalImpl 日志 严重:javax.servlet.ServletContext 日志:调度传入 RPC 调用时出现异常 com.google.gwt.user.server.rpc.UnexpectedException:服务方法 'public abstract java.lang.String com.six.n5.client.service.ImageService.getUpLoadPath()' 引发了意外异常:java.lang.VerifyError :类 com.google.appengine.api.blobstore.BlobstoreServicePb$CreateUploadURLRequest 覆盖最终方法 isInitialized.()Z 在 com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:385) 在 com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:588) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 在 com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:216) 在 com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:141) 在 com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:93) 在 com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:63) 在 com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:122) 在 com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:110) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 在 org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 org.mortbay.jetty.Server.handle(Server.java:326) 在 org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 在 org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 在 org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 引起:java.lang.VerifyError:com.google.appengine.api.blobstore.BlobstoreServicePb$CreateUploadURLRequest 类覆盖最终方法 isInitialized.()Z 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClass(未知来源) 在 java.security.SecureClassLoader.defineClass(未知来源) 在 java.net.URLClassLoader.defineClass(未知来源) 在 java.net.URLClassLoader.access$100(未知来源) 在 java.net.URLClassLoader$1.run(未知来源) 在 java.net.URLClassLoader$1.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176) 在 java.lang.ClassLoader.loadClass(未知来源) 在 com.google.appengine.api.blobstore.BlobstoreServiceImpl.createUploadUrl(BlobstoreServiceImpl.java:43) 在 com.google.appengine.api.blobstore.BlobstoreServiceImpl.createUploadUrl(BlobstoreServiceImpl.java:34) 在 com.six.n5.server.ImageServiceImpl.getUpLoadPath(ImageServiceImpl.java:153) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100) 在 com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) ... 39 更多

【问题讨论】:

    标签: gwt blobstore


    【解决方案1】:

    我发现了自己的错误!事实证明,这突然失败的原因是因为 FORM 帖子认为它是跨域发布。我正在通过调用 127.0.0.1:8888..etc 来测试网站,但是当调用我的 Image RPC 以建立上传路径时,它返回到我的机器名称 kmoore-PC:8888..etc 的表单 setAction的 127.0.0.1:8888... 因此它返回 null 因为它认为它正在跨越域。

    要修复,请单击 url 栏中的 google 框并添加您的计算机名称,然后使用计算机名称而不是 127 测试您的应用

    【讨论】:

      【解决方案2】:

      我尝试用机器名称替换本地主机,但它没有帮助,但这是一个跨域 java 脚本问题,所以我尝试只使用在 web xml 中分配的 URL 模式,我得到了一个字符串结果。结果是我用 XML 包装的响应,我打算解析它。如果有人有更优雅的东西,请告诉我。

      这里是响应字符串[它看起来有点不同,因为它会影响堆栈溢出页面]:

      pre style="word-wrap: break-word; white-space: pre-wrap;">我的回复ID

      这里是相关的服务器代码

      public void doPost(HttpServletRequest request, HttpServletResponse response) throws >ServletException, IOException { //递归地重定向到这个servlet(调用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;
      
      }
      

      这里是相关的客户端代码,这里不需要解析的是服务端代码:

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

      编辑我发现了一种更优雅的方式来传递长 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);
      
            }
      

      【讨论】:

        【解决方案3】:

        我没有使用计算机名称,而是在开发模式下将其替换为 127 地址,如下所示:

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

        【讨论】:

          猜你喜欢
          • 2015-09-29
          • 1970-01-01
          • 2011-08-11
          • 2014-10-20
          • 1970-01-01
          • 2011-04-04
          • 1970-01-01
          • 2012-12-17
          • 1970-01-01
          相关资源
          最近更新 更多