【发布时间】:2016-08-23 01:48:35
【问题描述】:
我需要从 Java REST 服务返回一个 Microsoft Excel 文件。我正在使用 WebSphere 8.5,它固有地使用 Apache Wink 作为它的 JAX-RS 实现;这是我无法改变的要求。我也在使用 Java 7 JDK。这是我收到的错误:
org.apache.wink.server.internal.handlers.FlushResultHandler handleResponse 系统找不到 javax.ws.rs.ext.MessageBodyWriter 或 DataSourceProvider 类 com.somewhere.else.message.core.BaseResponseMessage 类型和 应用程序/vnd.ms-excel 媒体类型。确保一个 javax.ws.rs.ext.MessageBodyWriter 存在于 JAX-RS 应用程序中 指定的类型和媒体类型。
这是我的 Java Resource 类方法:
@GET
@Path("/report")
@Produces("application/vnd.ms-excel")
public Response getReport() {
int fileSize = 0;
byte[] reportByteArray = null;
ResponseBuilder responseBuilder = null;
InputStream report = null;
BaseResponseMessage<InputStream> baseResponseMessage = new
BaseResponseMessage<InputStream>();
Path reportPath = null;
String localPath = "C:/Users/me/Report.xls";
responseBuilder = Response.ok(baseResponseMessage);
responseBuilder.header("Content-Description", "File Transfer");
responseBuilder.header("Content-Disposition", "attachment;
filename=Report.xls");
responseBuilder.header("Content-Transfer-Encoding", "binary");
responseBuilder.header("Connection", "Keep-Alive");
reportPath = Paths.get(localPath);
if (Files.exists(reportPath)) {
if (Files.isReadable(reportPath)) {
reportByteArray = Files.readAllBytes(reportPath);
report = new ByteArrayInputStream(reportByteArray);
}
}
fileSize = report.available();
responseBuilder.header("Content-Length", fileSize);
baseResponseMessage.setPayload(report);
return responseBuilder.build();
}
通过查看调试器,我确实知道正确找到了路径和 excel 文件,并且 fileSize 也正确填充。
我很乐意提供所需的更多信息。感谢您的宝贵时间!
【问题讨论】:
标签: java excel rest websphere-8 apache-wink