简体   繁体   English

GAE Blobstore IllegalStateException:无内容

[英]GAE Blobstore IllegalStateException: NO CONTENT

When attempting to serve a file from the blobstore via BlobstoreService.serve(key, res), I get the following error: 尝试通过BlobstoreService.serve(key,res)从blobstore提供文件时,出现以下错误:

WARNING: /path/to/servlet
java.lang.IllegalStateException: NO CONTENT
at org.mortbay.jetty.HttpGenerator.addContent(HttpGenerator.java:106)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:644)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:579)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.copy(ServeBlobFilter.java:129)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.serveBlob(ServeBlobFilter.java:185)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:64)
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 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
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.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:370)
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 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

If I attempt to download from this URL using a browser, the browser stores a file of size 0 bytes. 如果我尝试使用浏览器从此URL下载,则浏览器将存储一个大小为0字节的文件。 I am testing this on the dev server from SDK 1.7.1. 我正在SDK 1.7.1的开发服务器上对此进行测试。

I am using Jersey to create the REST API, which seems to be causing the problem. 我正在使用Jersey创建REST API,这似乎引起了问题。 If I create a regular servlet, it serves the file properly. 如果我创建一个常规的servlet,它将正确地提供文件。 I wonder whether this is an issue with using the @GET annotation, which requires that the function return something. 我想知道使用@GET批注是否存在问题,这要求函数返回某些内容。 However, if I return anything, the blobstore complains and tells me that it has been preempted by data that has already been sent. 但是,如果我返回任何内容,那么Blobstore会抱怨并告诉我,它已经被已发送的数据抢占了。

The service doesn't even seem to be sending any headers back in response to a request. 该服务甚至似乎都没有发送任何标头以响应请求。

Here is the code that is supposed to send the response: 这是应该发送响应的代码:

@GET
public void getAirport(@PathParam(APIUtils.VERSION_NAME) String versionName, @Context HttpServletResponse res) throws IOException {
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();

    DataDAO dao = new DataDAO();
    BlobKey key = dao.getAirportBlobKey(versionName);

    if(key == null) {
        res.sendError(HttpServletResponse.SC_NOT_FOUND, "No airport record found for: " + versionName);
    }
    else {
        blobstoreService.serve(key, res);
    }
}

Any ideas? 有任何想法吗?

I haven't found any documentation to explain this behavior, but I was able to fix my problem. 我没有找到任何文档来解释此行为,但是我能够解决我的问题。 The following seems to be a solution: 以下似乎是一种解决方案:

blobstoreService.serve(key, res);
return Response.created(null).status(HttpServletResponse.SC_OK).build();

Since the body of the response is null , is doesn't interfere with the blobstore serving the blob. 由于响应的主体为null ,因此不会干扰提供Blob的Blob存储区。 I'd still like to know some more about the inner workings when Jersey processes the @GET annotation, but at least this works for now. 我仍然想了解有关Jersey处理@GET批注时内部工作原理的更多信息,但至少现在可以使用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM