メディアtype = application / octet-stream、type = classorg.apache.poi.xssf.usermodel.XSSFWorkbookのMessageBodyWriterが見つかりません

スティーブ

以下のクラスで、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最初に理解する必要があるのは、オブジェクトがどのようにシリアル化されるかです。これは、MessageBodyWritersを使用して行われます。それらについて詳しくは、JAX-RSエンティティプロバイダーをご覧ください

ライターがどのように機能するかは、エンティティと応答ストリームが渡されることです。ライターはエンティティを取得し、エンティティのコンテンツを応答ストリームに書き込むことになっています。ライターは、返されるエンティティのタイプと予想されるメディアタイプによって検索されます。あなたの場合は、それを希望しますapplication/octet-stream

エラーが言っているのは、の変換を処理するライターがないということですXSSFWorkbookあなたが話すときapplication/octet-stream、あなたは主にバイナリファイルを扱っています。XSSFWorkbookバイナリファイルではありません。で作業する場合application/octet-stream、あなたはほとんどと仕事ができるだろうbyte[]FileInputStream、および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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ