Java 创建服务URL失败:找不到对象?

Java 创建服务URL失败:找不到对象?,java,google-app-engine,google-cloud-platform,Java,Google App Engine,Google Cloud Platform,我的项目正在应用程序引擎上运行。我有一个servlet,每当图像上传到某个bucket时,它都会收到一个通知。然后我从bucket中检索图像数据,调整其大小并将其存储到另一个bucket中。 到目前为止,一切正常。 现在我想使用BlobKey为这个图像创建一个服务url。通过这样做,我通过调用方法得到了一个错误: servingUrl = imageService.getServingUrl(ServingUrlOptions.Builder.withBlobKey(bk).secureUrl(

我的项目正在应用程序引擎上运行。我有一个servlet,每当图像上传到某个bucket时,它都会收到一个通知。然后我从bucket中检索图像数据,调整其大小并将其存储到另一个bucket中。 到目前为止,一切正常。 现在我想使用BlobKey为这个图像创建一个服务url。通过这样做,我通过调用方法得到了一个错误:

servingUrl = imageService.getServingUrl(ServingUrlOptions.Builder.withBlobKey(bk).secureUrl(true));

java.lang.IllegalArgumentException: OBJECT_NOT_FOUND: 
at com.google.appengine.api.images.ImagesServiceImpl.getServingUrl(ImagesServiceImpl.java:282)
at com.google.training.helloworld.ImageTransformHandler.createServingUrlWithBlobkey(ImageTransformHandler.java:51)
at com.google.training.helloworld.Upload.doPost(Upload.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:37)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:260)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:78)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:148)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:468)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444)
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:256)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:235)
at java.lang.Thread.run(Thread.java:745)
我检查了我所有的论点,它们肯定在那里。你知道这个错误是什么意思吗?我怎样才能修复它

编辑 我的servlet代码如下所示。如您所见,我将不同的google服务(如gcs)包装在一个处理程序类中

UploadObject object             = new UploadObject(notification);
CloudStorageHandler gcs         = new CloudStorageHandler();
BlobstoreHandler bs             = new BlobstoreHandler();
ImageTransformHandler is        = new ImageTransformHandler();

/**GET DATA FROM GCS**/

byte[] data = gcs.getFileFromGoogleCloudStorage(object.getGcsBucket(), object.getGcsPath());

/******************/

/**TRANSFORMATION**/

byte[] newImageData = is.resizePicture(data, 1200, 1200, "JPEG", 65, 0.5, 0.5);

/******************/

/** STORE NEW RESIZED IMAGE IN GCS BUCKET **/

UploadObject tmp = new UploadObject(object.getGcsPath(), "JPEG", "beispiel", 1200, 1200);
tmp.setData(newImageData);
gcs.saveFileToGoogleCloudStorage(newImageData, "beispiel", object.getGcsPath(), "JPEG", "public-read");

/******************/

/** CREATE SERVING URL **/
//BlobKey bk_neu = bs.createBlobKey("beispiel", object.getGcsPath());
//String servingUrl = is.createServingUrlWithBlobkey(bk_neu);
String servingUrl = is.createServingUrlByName(tmp.getGcsBucket(), tmp.getGcsPath());

...

由于您的文件似乎位于云存储中的一个存储桶中,您可能会问,为什么要尝试使用BlobKey创建一个服务URL。为什么不使用
ServingUrlOptions.Builder.withGoogleStorageFileName
?据我所知,删除servingUrl的唯一方法是提供blobkey。因此,我希望它是一致的。此外,
ServingUrlOptions.Builder.withGoogleStorageFileName
返回相同的错误
BlobstoreService.createGsBlobKey()
为云存储中的任何现有或不存在的文件创建blob密钥。无论如何,由于错误表明找不到对象,因此可能只是找不到对象。在为云存储对象创建blob密钥的位置进行搜索。这可能就是问题所在,因为没有检查文件名表示的文件的存在性,因此可以为当前不存在的文件创建BlobKey。(来源:BlobstoreService javadoc)这将解释所有症状。是的,可能就是这样。但是如果我遗漏了创建服务url的那一行。一切都很好。如果我仔细观察我的存储,我可以看到调整大小的图像。当文件成功存储到bucket中时,有没有办法从我的“storeToGcs”方法获取回调或其他信息?或者从另一个方面来说,我如何检查,是否有一个文件被添加到我的bucket中的通知旁边?如果你说的通知是指这个()我不知道其他机制(除了轮询,轮询通常是个坏主意)。当然,在创建服务URL之前,一切都会正常工作,因为在此之前,您基本上只配置了转换器。我很确定你正在试图访问一个不存在的对象,甚至可能是某种比赛。