找不到媒体类型=application/octet-stream、类型=class org.apache.poi.xssf.usermodel.XSSFWorkbook 的 MessageBodyWriter
MessageBodyWriter not found for media type=application/octet-stream, type=class org.apache.poi.xssf.usermodel.XSSFWorkbook
我有下面的 class,它试图 return 一些 excel 电子表格形式的数据。我收到错误
MessageBodyWriter not found for media type=application/octet-stream, type=class org.apache.poi.xssf.usermodel.XSSFWorkbook
我也试过 @Produces("application/vnd.ms-excel")
,但遇到了类似的错误。有人对我如何将其添加到 return 电子表格有任何建议吗?上次我收到类似这样的错误消息(抱怨找不到 arraylist 的消息正文编写器),我只是将其包装在一个通用实体中。那个技巧这次没用。
@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.
中了解更多信息
编写器的工作方式是将实体和响应流传递给它。作者应该获取实体并将实体的内容写入响应流。根据我们 return 的实体类型和预期的媒体类型查找作者,在您的情况下,您希望它是 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();
}
我有下面的 class,它试图 return 一些 excel 电子表格形式的数据。我收到错误
MessageBodyWriter not found for media type=application/octet-stream, type=class org.apache.poi.xssf.usermodel.XSSFWorkbook
我也试过 @Produces("application/vnd.ms-excel")
,但遇到了类似的错误。有人对我如何将其添加到 return 电子表格有任何建议吗?上次我收到类似这样的错误消息(抱怨找不到 arraylist 的消息正文编写器),我只是将其包装在一个通用实体中。那个技巧这次没用。
@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.
编写器的工作方式是将实体和响应流传递给它。作者应该获取实体并将实体的内容写入响应流。根据我们 return 的实体类型和预期的媒体类型查找作者,在您的情况下,您希望它是 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();
}