2016-08-23 13 views
1

Java RESTサービスからMicrosoft Excelファイルを返す必要があります。私はJAX-RSの実装としてApache Winkを本質的に使用するWebSphere 8.5を使用しています。それは私が変更できない要件です。私はJava 7 JDKも使用しています。ここで私が受けてるのエラーは次のとおりです。Apache Winkを使用してJava RESTサービス経由でExcel文書を返す

のhandleResponseシステムが javax.ws.rs.ext.MessageBodyWriterまたはDataSourceProviderクラスを見つけることができませんでしたorg.apache.wink.server.internal.handlers.FlushResultHandler の場合はcom.somewhere.else.message.core.BaseResponseMessageタイプ、 の場合はapplication/vnd.ms-excel mediaTypeです。 JAX-RSアプリケーションの javax.ws.rs.ext.MessageBodyWriterが の型とメディアタイプが指定されていることを確認してください。

は、ここに私のJavaリソースのクラスメソッドである:

@GET 
@Path("/report") 
@Produces("application/vnd.ms-excel") 
public Response getReport() { 

    int fileSize = 0; 

    byte[] reportByteArray = null; 

    ResponseBuilder responseBuilder = null; 
    InputStream report = null; 

    BaseResponseMessage<InputStream> baseResponseMessage = new 
    BaseResponseMessage<InputStream>(); 

    Path reportPath = null; 

    String localPath = "C:/Users/me/Report.xls"; 

    responseBuilder = Response.ok(baseResponseMessage); 

    responseBuilder.header("Content-Description", "File Transfer"); 
    responseBuilder.header("Content-Disposition", "attachment; 
     filename=Report.xls"); 
    responseBuilder.header("Content-Transfer-Encoding", "binary"); 
    responseBuilder.header("Connection", "Keep-Alive"); 

    reportPath = Paths.get(localPath); 

    if (Files.exists(reportPath)) { 

     if (Files.isReadable(reportPath)) { 

      reportByteArray = Files.readAllBytes(reportPath); 

      report = new ByteArrayInputStream(reportByteArray); 
     } 
    } 

    fileSize = report.available(); 

    responseBuilder.header("Content-Length", fileSize); 

    baseResponseMessage.setPayload(report); 

    return responseBuilder.build(); 
} 

私はパスとExcelファイルが正しく検出されたデバッガを見てから知っていますし、ファイルサイズも同様に正しく読み込まれます。

私は喜んで必要な情報を提供します。あなたの時間をありがとう!

答えて

0

問題がBaseResponseMessageの存在でした。実際にInputStreamの代わりにResponseオブジェクトのBaseResponseMessageを実際に返していたためです(エラー状態として)その組み合わせに特に関連するMessageBodyWriterまたはDataSourceProviderがないので、JAX-RSはその処理方法を知らなかったのです。エラーメッセージが実際に実際の問題をどのように明らかにしたのか、面白かったですか? :P

上記のコードはこのような何かをBaseResponseMessageを削除して行うように変更され

responseBuilder = Response.ok(report);

は、それだけで正常に動作します。

[脇に戻って、InputStreamを返すことは、とにかく良い考えではありません。そのコードはStreamingOutputオブジェクトを返すように変更されています。]

2

問題は@Producesアノテーションにあると思います。 JAX-RSは、デフォルトで "application/vnd.ms-excel"の処理方法を知らないかもしれません。あなたは

  1. は、アプリケーションクラスを作成し
  2. JEE 6 Webプロジェクトを作成し、ここではサンプルコードがある

    @Produces(MediaType.APPLICATION_OCTET_STREAM) 
    

    を使用して

    輸入javax.ws.rs.ApplicationPathを試すことができます。
    import javax.ws.rs.core.Application;

    @ApplicationPath( "/サービス/ *")
    パブリッククラスMyApplicationをが延びるアプリケーションRESTリソースクラス作成{

    }

  3. インポートjava.io.Fileの。
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response;
    import javax.ws.rs.core.Response。ResponseBuilder;

    @Path( "/ハロー")
    パブリッククラスHelloResource {

    @GET 
    @Path("excel") 
    @Produces(MediaType.APPLICATION_OCTET_STREAM) 
    public Response test2() { 
        File file = new File("C:/users/arun/rest-test.xlsx"); 
        ResponseBuilder rb = Response.ok(file); 
        rb.header("content-disposition", "attachment; filename=rest-test.xlsx"); 
        return rb.build(); 
    } 
    

    }

+0

変更を加えるときにこれが問題ではないようです: 'org.apache.wink.server.internal.handlers.FlushResultHandler handleResponseシステムはできませんでした。 com.somewhere.else.message.core.BaseResponseMessageタイプおよびapplication/octet-streamメディアタイプのjavax.ws.rs.ext.MessageBodyWriterクラスまたはDataSourceProviderクラスを見つけます。 JAX-RSアプリケーションにjavax.ws.rs.ext.MessageBodyWriterが存在することを、指定されたタイプとメディアタイプで確認します.'おそらく、直接レスポンスではなくBaseResponseMessageで返されるレスポンスと関係がありますか? – risingTide

関連する問題