Ошибка GWT Blobstore при вызове createUploadUrl () - PullRequest
8 голосов
/ 19 сентября 2011

Я пытаюсь использовать API Blobstore для appengine с использованием GWT ... Обещаю!У меня это работало в течение нескольких месяцев, и внезапно я начал получать следующие ошибки .. после выполнения следующей строки из сервлета.

открытый класс 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 19 сентября 2011 г. 19:28:45 com.google.apphosting.utils.jetty.JettyLogger info INFO:Регистрация в JettyLogger (null) через com.google.apphosting.utils.jetty.JettyLogger 19 сентября 2011 г. 19:28:45 com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml ИНФОРМАЦИЯ: Успешно обработано C: \ development \ n5\ n5 \ war \ WEB-INF / appengine-web.xml 19 сентября 2011 г. 19:28:45 com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml ИНФОРМАЦИЯ: Успешно обработано C: \ development \ n5 \ n5 \ war\ WEB-INF / web.xml 19 сентября 2011 г. 15:28:47 com.google.appengine.tools.development.DevAppServerImpl start ИНФОРМАЦИЯ: Сервер работает на http://localhost:8888/ 19 сентября 2011 г. 7:34: 59 PM com.google.appengine.tools.development.ApiProxyLocalImpl log ПОСЛЕДОВАТЕЛЬНО: javax.servlet.ServletContext log: исключение при отправке входящего вызова RPC com.google.gwt.user.server.rpc.UnexpectedException: метод службы 'public abstract java.lang.Stringcom.six.n5.client.service.ImageService.getUpLoadPath () 'вызвало непредвиденное исключение: java.lang.VerifyError: class com.google.appengine.api.blobstore.BlobstoreServicePb $ CreateUploadURLRequest переопределяет конечный метод, инициализированный ZInitial.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:24w) на com.google.server.rpc.AbstractRemoteServiceServlet.doPost (AbstractRemoteServiceServlet.java:62) в javax.servlet.http.HttpServlet.service (HttpServlet.java:637) в javax.servlet.http.Httperverv.tv.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.ManagedFilpPJava: 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.appengineerBlove.bb.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 at comg.appengine.tools.development.BackendServersFilter.doFilter (BackendServersFilter.java:97) в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) в org.merleletHay(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 (DevAppEngineWebApp )70mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152) по адресу com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle (JettyContainerService.java:351) по адресу org.mortbay.jetty.Herty.дескриптор (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.thQueuedThreadPool $ PoolThread.run (QueuedThreadPool.java:582) Вызывается: java.lang.VerifyError: class com.google.appengine.api.blobstore.BlobstoreServicePb $ CreateUploadURLRequest переопределяет конечный метод isInitlass.Lag.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 (BlobstoreServiceI43) .gapp.gj.api.NativeMethodAccessorImpl.invoke (неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (неизвестный источник) в java.lang.reflect.Method.invoke (неизвестный источник) в com.google.appengine.tools.development.agent.runtime.invoke (Runtime.java:100) на com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:569) ... еще 39

Ответы [ 3 ]

12 голосов
/ 12 октября 2011

Я нашел свою ошибку!как выяснилось, причина, по которой это внезапно перестало работать, заключалась в том, что сообщение ФОРМЫ считало, что это междоменная публикация.Я тестировал веб-сайт, позвонив по номеру 127.0.0.1:8888..etc, но когда мой RPC-файл Image был вызван для определения пути загрузки, он вернулся к форме setAction вместо имени моего компьютера kmoore-PC: 8888..etcиз 127.0.0.1:8888 ... и, следовательно, он возвратил ноль, потому что он думал, что он пересекает домены.

Чтобы исправить, нажмите на поле Google в строке URL-адреса и добавьте имя своего компьютера, а затем протестируйте свое приложениеиспользуя имя компьютера вместо 127

0 голосов
/ 13 сентября 2013

Вместо того, чтобы использовать имя компьютера, я просто заменяю его адресом 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");
}
0 голосов
/ 27 июня 2013

Я попытался заменить локальный хост именем компьютера, но это не помогло, но это проблема междоменного java-скрипта, поэтому я попытался просто использовать шаблон URL, назначенный в веб-файле XML, и получил результат String.В результате мой ответ обернут XML и я планирую его проанализировать.если у кого-то есть что-то более элегантное, пожалуйста, скажите мне.

вот строка ответа [выглядит немного иначе, поскольку влияет на страницу переполнения стека]:

pre style = "word-wrap: break-word; пробел: pre-wrap; "> идентификатор моего ответа

Вот соответствующий код сервера

public void doPost (HttpServletRequestrequest, HttpServletResponse response) throws> ServletException, IOException {// рекурсивно перенаправить на этот сервлет (вызывает 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());
          }

      }

    });

Правка Я нашел более элегантный способ доставкидлинный идентификатор

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

      }
...