jersey - 找不到媒体类型 = 应用程序/八位字节流,类型 = 类 org.apache.poi.xssf.usermodel.XSSFWorkbook 的 MessageBodyWriter
问题描述
我有下面的类,它试图以 excel 电子表格的形式返回一些数据。我收到错误
找不到媒体类型 = 应用程序/八位字节流,类型 = 类 org.apache.poi.xssf.usermodel.XSSFWorkbook 的 MessageBodyWriter
我也试过@Produces("application/vnd.ms-excel")
了,但也遇到了类似的错误。有人对我如何让这个返回电子表格有建议吗?上次我收到与此类似的错误消息(抱怨找不到数组列表的消息正文编写器)时,我只是将它包装在一个通用实体中。这次这个技巧没有奏效。
@PermitAll
@Path("uploadWorkbook")
public class ExcelUploadResource {
@Context
ResourceContext resourceContext;
@Inject
JobService jobService;
@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response list() {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Job definitions");
int rowNum = 0;
for(Job job : jobService.list()){
Row row = sheet.createRow(rowNum++);
int cellNum = 0;
for(String field : job.toList()){
Cell cell = row.createCell(cellNum++);
cell.setCellValue(field);
}
}
GenericEntity<XSSFWorkbook> entity = new GenericEntity<XSSFWorkbook>(workbook) {};
ResponseBuilder response = Response.ok(entity);
response.header("Content-Disposition",
"attachment; filename=jobs.xls");
return response.build();
}
}
解决方案
您不能只使用具有数据类型的任意对象application/octet-stream
。您首先需要了解的是对象是如何序列化的。这是通过使用MessageBodyWriter
s 完成的。您可以在JAX-RS Entity Providers中了解有关它们的更多信息。
writer 的工作方式是传递实体和响应流。编写器应该获取实体并将实体的内容写入响应流。根据我们返回的实体类型和预期的媒体类型查找作者,在您的情况下,您希望它是application/octet-stream
.
错误的意思是没有编写器来处理您的XSSFWorkbook
. 当您谈论 . 时application/octet-stream
,您主要是在处理二进制文件。XSSFWorkbook
不是二进制文件。使用 时application/octet-stream
,您将主要使用byte[]
、File
、InputStream
和StreamingOutput
实体类型。因此,如果您想使用application/octet-stream
,则需要将实体更改为其中一种类型。
我从未使用过 Apache POI,但只是通过一个快速教程,看起来您可能想要在这种情况下使用的是StreamingOutput
,您可以使用该XSSFWorkbook#write(OutputStream)
方法将工作簿写入StreamingOutput
public Response getExcelFile() {
XSSFWorkbook workbook = new XSSFWorkbook();
...
StreamingOutput output = new StreamingOutput() {
@Override
public void write(OutputStream out)
throws IOException, WebApplicationException {
workbook.write(out);
out.flush();
}
};
return Response.ok(output)
.header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=jobs.xls")
.build();
}
推荐阅读
- python - 为什么我的函数不断循环,我该如何解决?
- java - 如何使用jsp从表中检索数据?
- python - 图成一个子图matplotlib
- android - 有没有办法从 youtubeintents 检索订阅频道的数据?
- php - 调试MySql Gone away错误,随机获取多个休眠线程
- ssis - SSIS 导入 CSV 用引号分隔
- python - 程序员说“引发错误”是什么意思(例如,为什么要这样做)?
- android - 使用 AndroidX 运行检测测试时未找到测试
- c - 具有 2 个客户端的 UDP 服务器,如何为它们分配特定端口
- deployment - NixOS 中的 NixOS?