2016-08-23 5 views
1

Java REST 서비스에서 Microsoft Excel 파일을 반환해야합니다. 필자는 본질적으로 Apache Wink를 JAX-RS 구현으로 사용하는 WebSphere 8.5를 사용하고 있습니다. 그것은 내가 바꿀 수없는 요구 사항입니다. 나는 또한 자바 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가 유형 및 미디어 유형으로 지정되어 있는지 확인하십시오.

은 여기 내 자바 리소스 클래스 방법 :

@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(); 
} 

내가 경로와 엑셀 파일이 제대로 발견되는 디버거를보고 알고 않으며, 이는 파일 크기도 제대로 채워집니다.

나는 필요한 정보를 기꺼이 제공 할 것입니다. 시간 내 주셔서 감사합니다!

답변

0

문제 BaseResponseMessage의 존재였다. 실제로 실제 InputStream JAX-RS 대신 Response 객체의 BaseResponseMessage을 반환했기 때문에 분명히 있기 때문에이를 처리하는 방법을 알고하지 않았다 (오류 상태와 같은) MessageBodyWriter이 아니거나 DataSourceProvider는 특히 그 조합과 관련. 오류 메시지가 실제 문제를 실제로 밝혀내는 방법을 재밌게 읽었습니다. : P

위의 코드는 다음과 같이 뭔가를 BaseResponseMessage을 제거 할 수정

:

responseBuilder = Response.ok(report);

는 그냥 잘 작동합니다. InputStream 정말 어쨌든 좋은 생각이 아니다 돌아가는 옆으로

[

; 이 코드는 이후 StreamingOutput 오브젝트를 반환하도록 수정되었습니다.]

2

문제는 @Produces 주석에 있다고 생각합니다. JAX-RS는 기본적으로 "application/vnd.ms-excel"을 처리하는 방법을 알지 못할 수 있습니다. 당신은

  • 이 응용 프로그램 클래스를

    수입 javax.ws.rs.ApplicationPath을 만든 JEE 6 웹 프로젝트를 만들고, 여기에

    @Produces(MediaType.APPLICATION_OCTET_STREAM) 
    

    샘플 코드가 사용

    1. 을 시도 할 수 있습니다;
      import javax.ws.rs.core.Application;

      @ApplicationPath ("/ 서비스/*")
      공용 클래스에서는 MyApplication가 확장 응용 프로그램 지내는 자원 클래스 생성 {

      }

    2. ,

      수입 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 유형 및 응용 프로그램/옥텟 스트림 mediaType 매개위한 javax.ws.rs.ext.MessageBodyWriter 또는 DataSourceProvider 클래스를 찾을 수 있습니다. JAX-RS 애플리케이션에 javax.ws.rs.ext.MessageBodyWriter가 지정된 유형 및 미디어 유형으로 존재하는지 확인하십시오. 아마도 직접 응답하는 대신 BaseResponseMessage에서 반환되는 응답과 관련이있을 것입니다. – risingTide