Вы не можете просто использовать произвольные объекты с типом данных application/octet-stream
.Сначала вам нужно понять, как объекты сериализуются.Это делается с использованием MessageBodyWriter
с.Вы можете узнать о них больше в Поставщиках сущностей JAX-RS .
. Как работает писатель, он передает сущность и поток ответа.Предполагается, что средство записи берет объект и записывает содержимое объекта в поток ответов.Авторы ищут тип сущности, которую мы возвращаем, и ожидаемый тип носителя, в вашем случае вы хотите, чтобы он был 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();
}