gpt4 book ai didi

java - 使用 Apache Wink 通过 Java REST 服务返回 excel 文档

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:39 26 4
gpt4 key购买 nike

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

org.apache.wink.server.internal.handlers.FlushResultHandler handleResponse The system could not find a javax.ws.rs.ext.MessageBodyWriter or a DataSourceProvider class for the com.somewhere.else.message.core.BaseResponseMessage type and application/vnd.ms-excel mediaType. Ensure that a javax.ws.rs.ext.MessageBodyWriter exists in the JAX-RS application for the type and media type specified.

这是我的 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();
}

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

我很乐意提供所需的任何更多信息。感谢您的宝贵时间!

最佳答案

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

@Produces( MediaType.APPLICATION_OCTET_STREAM)

这是示例代码,

  1. 创建一个 JEE 6 网络项目

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

    import javax.ws.rs.ApplicationPath;  
    import javax.ws.rs.core.Application;

    @ApplicationPath("/services/*")
    public class MyApplication extends Application {

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

关于java - 使用 Apache Wink 通过 Java REST 服务返回 excel 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39091126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com