使用 Apache Wink 通过 Java REST 服务返回 Excel 文档

ris*_*ide 4 java rest excel apache-wink websphere-8

我需要从 Java REST 服务返回 Microsoft Excel 文件。我正在使用 WebSphere 8.5,它本质上使用 Apache Wink,因为它是 JAX-RS 实现;这是我无法改变的要求。我也在使用 Java 7 JDK。这是我收到的错误:

org.apache.wink.server.internal.handlers.FlushResultHandler handleResponse 系统找不到 com.somewhere.else.message.core.BaseResponseMessage 类型和应用程序的 javax.ws.rs.ext.MessageBodyWriter 或 DataSourceProvider 类/ vnd.ms-excel 媒体类型。确保在 JAX-RS 应用程序中存在指定类型和媒体类型的 javax.ws.rs.ext.MessageBodyWriter。

这是我的 Java Resource 类方法:

@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();
}
Run Code Online (Sandbox Code Playgroud)

我确实通过查看调试器知道正确找到了路径和 excel 文件,并且 fileSize 也正确填充。

我很乐意提供更多需要的信息。感谢您的时间!

Aru*_*ran 5

我认为问题出在@Produces注释上。JAX-RS 可能不知道"application/vnd.ms-excel"默认情况下如何处理。您可以尝试使用

@Produces( MediaType.APPLICATION_OCTET_STREAM)
Run Code Online (Sandbox Code Playgroud)

这是示例代码,

  1. 创建 JEE 6 Web 项目

  2. 创建了一个应用程序类

    import javax.ws.rs.ApplicationPath;  
    import javax.ws.rs.core.Application; 
    
    @ApplicationPath("/services/*")  
    public class MyApplication extends Application {  
    
    }  
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建了一个 REST 资源类,

    import 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("/hello")  
    public class 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();  
        }  
    }  
    
    Run Code Online (Sandbox Code Playgroud)