- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 ReSTLet 资源遇到问题。它使用 TrueZip 构建 Zip 存档的子集并允许用户下载它。
// Create a Streaming Response Entity.
final StreamingOutput stream = new StreamingOutput() {
@Override
public void write(final OutputStream output) {
ZipBrowser.extract(source, path, output);
}
};
LOGGER.debug("Download of Path {} with the length {} initiated", path, length);
ResponseBuilder rb = Response.ok(stream);
rb.header(HeaderConstants.HEADER_CONTENT_DISPOSITION, CONDISPOVALUE + fileName);
rb.header(HeaderConstants.HEADER_CONTENT_LENGTH, length);
return rb.build();
尽管它有效,但我收到了一个恼人的 StreamClosedException。只有当我尝试下载一个子集而不是整个 Zip 存档时才会出现此错误:
An exception occured writing the responseentity
sun.net.httpserver.StreamClosedException
at sun.net.httpserver.ChunkedOutputStream.flush(ChunkedOutputStream.java:156)
at sun.net.httpserver.PlaceholderOutputStream.flush(ExchangeImpl.java:449)
at org.restlet.engine.adapter.ServerCall.writeResponseBody(ServerCall.java:511)
at org.restlet.engine.adapter.ServerCall.sendResponse(ServerCall.java:454)
at org.restlet.engine.adapter.ServerAdapter.commit(ServerAdapter.java:187)
at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:144)
at org.restlet.engine.connector.HttpServerHelper$1.handle(HttpServerHelper.java:64)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:77)
at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:80)
at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:677)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:77)
at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:649)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)Unable to send error response
java.io.IOException: headers already sent
at sun.net.httpserver.ExchangeImpl.sendResponseHeaders(ExchangeImpl.java:204)
at sun.net.httpserver.HttpExchangeImpl.sendResponseHeaders(HttpExchangeImpl.java:86)
at org.restlet.engine.connector.HttpExchangeCall.writeResponseHead(HttpExchangeCall.java:148)
at org.restlet.engine.adapter.ServerCall.sendResponse(ServerCall.java:450)
at org.restlet.engine.adapter.ServerAdapter.commit(ServerAdapter.java:205)
at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:144)
at org.restlet.engine.connector.HttpServerHelper$1.handle(HttpServerHelper.java:64)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:77)
at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:80)
at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:677)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:77)
at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:649)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
最佳答案
这是由 zip 库和 ReSTLet Framework 在完成后试图关闭 OutputStream
引起的。
我过去在其他库中遇到过这种情况,并设法通过包装 OutputStream
来消除异常,我将传递给 zip 库的类覆盖了 close()
什么也不做。委托(delegate)所有其他方法。然后这允许 ReSTLet 关闭流。
这样在您的代码中调用 Zip 实用程序的行就变成了:
ZipBrowser.extract(source, path, new WrappedOutputStream(output));
WrappedOutputStream
类如下所示(需要添加委托(delegate)方法)。
import java.io.IOException;
import java.io.OutputStream;
public class WrappedOutputStream extends OutputStream {
private final OutputStream delegate;
public WrappedOutputStream(final OutputStream delegate) {
this.delegate = delegate;
}
public void close() throws IOException {
// Do Nothing to allow Restlet to close the underlying stream
}
// TODO Delegate other Outpt Stream methods.
}
关于java - ReSTLet - 使用 StreamingOutput 的 StreamClosedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35359355/
我有一个安静的网络服务。我正在考虑从类中的另一个方法调用一个方法。是否可以?如果是这样,我如何读取下面示例中的流输出的内容?另外,我分别需要这两个函数,以便我可以返回二进制文件或显示文本文件的文本 @
我正在尝试将 StreamingOutput 转换为 Java 中的字符串,以将其传递给另一个方法。它生成字符串,但稍后会引发以下错误。 JAXRSUtils logMessageHandlerPro
我已经在我的 Jersey Resource 类中实现了流输出。 @GET @Path("xxxxx") @Produces(BulkConstants.TEXT_XML_MEDIA_TYPE})
我有两个关于 Jersey 中的 StreamingOutput 的问题: 1) 它是否已被 jax-rs 运行时缓冲?我见过一些在重写 write() 方法时从 OutputStream 对象创建
我在从 StreamingOutput 实现中抛出 WebApplicationException 时遇到困难。我希望下面的代码返回 501,但curl 报告 curl: (52) Empty rep
JAX-RS 提供了 StreamingOutput 接口(interface),我们可以实现它来对我们的响应主体进行原始流处理。 public interface StreamingOutput {
我有一个类,它将视频作为 mp4 文件发送给用户(Http 请求/响应)我想用主要逻辑模拟方法来测试它。我的代码 public StreamingOutput videoAsStream(final
有人可以发布一个示例,说明如何在 Jersey 中将 StreamingOutput 设置为 Response 对象中的实体吗? 我还没有找到这样的例子。 最佳答案 看看这是否有帮助: @GET @P
我们如何使用来自 AngularJS 的 get 请求来下载文件,并使用 REST API 到 Java 作为中间层,并且在 Java 层,数据根据 API 中的查询参数作为输入流。请帮忙 流程如下:
我在 Response 对象中返回一个 StreamingOutput: @GET @Path("/downloadFile/{filename}") @Produces(MediaType.TEXT
我的 ReSTLet 资源遇到问题。它使用 TrueZip 构建 Zip 存档的子集并允许用户下载它。 // Create a Streaming Response Entity. final
我在 spring boot 中创建了一个 web 应用程序,我想在其中使用 Spring MVC rest 框架而不是 jersey。我正在尝试做这样的事情,但它给了我错误。我想要 Spring M
我有一个 Jersey 服务将二进制数据输出为 StreamingOutput、MediaType.APPLICATION_OCTET_STREAM。 如何使用 Jersey 2 实现客户端来处理来自
我正在使用 Jersey StreamingOutput在我们升级到 Jersey 2.16 之前,它一直工作得很好。事情是这样的。我的 StreamingOuput在某些情况下产生输出非常缓慢。我确
我正在做类似于中提到的事情 Example of using StreamingOutput as Response entity in Jersey @GET @Produces(MediaType
StreamingOutput 的OutputStream 是否应该被实现类关闭? java-doc 没有给出任何建议。我猜它只是委托(delegate)给底层 ServletOutputStream
我的网络服务代码 final StreamingOutput stream = new StreamingOutput() { @Override public void write(fina
下面是我用来尝试流回 PDF 的代码。我之前在另一个环境中做过这件事,但由于某种原因,没有调用 StreamingOutput 上的 write() 方法。 没有错误被记录下来,它已经到了在日志中显示
我有一个返回StreamingOutput对象的方法。我想将这个 StreamingOutput 对象写入 Excel 文件。我编写了以下代码,这给了我 java.lang.ClassCastExce
我已使用此方法为我的 REST Web 服务创建一个 API,以便使用 jersey JAX-RS 下载文件: public Response returnFile(String filePath,S
我是一名优秀的程序员,十分优秀!