gpt4 book ai didi

jersey - 未找到 Media type=application/octet-stream、type=class org.apache.poi.xssf.usermodel.XSSFWorkbook 的 MessageBodyWriter

转载 作者:行者123 更新时间:2023-12-02 08:53:56 25 4
gpt4 key购买 nike

我有下面的类,它尝试以 Excel 电子表格的形式返回一些数据。我收到错误

MessageBodyWriter not found for media type=application/octet-stream, type=class org.apache.poi.xssf.usermodel.XSSFWorkbook

我也尝试过@Produces("application/vnd.ms-excel"),但也遇到了类似的错误。有人建议我如何让它返回电子表格吗?上次我收到与此类似的错误消息(提示找不到 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 来完成的。您可以在 JAX-RS Entity Providers 中了解更多有关它们的信息。 .

编写器的工作原理是传递实体和响应流。作者应该获取实体并将实体的内容写入响应流。通过我们返回的实体类型和预期的媒体类型来查找编写器,在您的情况下,您希望它是 application/octet-stream

错误的意思是没有编写器来处理您的 XSSFWorkbook 的转换。当您谈论application/octet-stream时,您主要是在处理二进制文件。 XSSFWorkbook 不是二进制文件。使用 application/octet-stream 时,您主要会使用 byte[]FileInputStream > 和 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();
}

关于jersey - 未找到 Media type=application/octet-stream、type=class org.apache.poi.xssf.usermodel.XSSFWorkbook 的 MessageBodyWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50400719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com