以下のクラスで、Excelスプレッドシートの形式でデータを返そうとしています。エラーが発生します
メディアtype = application / octet-stream、type = classorg.apache.poi.xssf.usermodel.XSSFWorkbookのMessageBodyWriterが見つかりません
私も試しましたが@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
sを使用して行われます。それらについて詳しくは、JAX-RSエンティティプロバイダーをご覧ください。
ライターがどのように機能するかは、エンティティと応答ストリームが渡されることです。ライターはエンティティを取得し、エンティティのコンテンツを応答ストリームに書き込むことになっています。ライターは、返されるエンティティのタイプと予想されるメディアタイプによって検索されます。あなたの場合は、それを希望しますapplication/octet-stream
。
エラーが言っているのは、の変換を処理するライターがないということですXSSFWorkbook
。あなたが話すときapplication/octet-stream
、あなたは主にバイナリファイルを扱っています。XSSFWorkbook
バイナリファイルではありません。で作業する場合application/octet-stream
、あなたはほとんどと仕事ができるだろうbyte[]
、File
、InputStream
、およびStreamingOutput
エンティティタイプ。したがって、を使用するapplication/octet-stream
場合は、エンティティをそれらのタイプの1つに変更する必要があります。
私はApachePOIを使用したことがありませんが、簡単なチュートリアルを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();
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加