使用Jersey传输文件和数据

时间:2012-03-14 22:00:46

标签: java rest jersey

我正在尝试用Jersey开发一些休息服务来上传和下载文件(类似于文件管理器)。如果我的服务只生成/使用File类作为“application / octet-stream”,就像下面的代码一样,它们可以工作。

@GET
@Produces("application/octet-stream")
public File getFile(String id) {
    try {
        File file = new File(System.getProperty("user.home"), id);
        return file;
    } catch (FileNotFoundException ex) {
        Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

但是,如果我尝试传输包含File字段和其他一些数据的自定义对象(示例中的FileEnvelope),我会收到错误。

@GET
@Produces("application/octet-stream")
public FileEnvelope getXml(String id) {
    try {
        File file = new File(System.getProperty("user.home"), id);
        FileEnvelope fileEnvelope = new FileEnvelope(file, "text");
        return fileEnvelope;
    } catch (FileNotFoundException ex) {
        Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

错误是

  

引起:com.sun.jersey.api.MessageException:Java类com.mycompany.restdemo.FileEnvelope的消息体编写器,Java类类com.mycompany.restdemo.FileEnvelope和MIME媒体类型application / octet -stream未找到

我哪里错了?这是管理此案例的正确方法吗?我的客户不能成为“泽西客户”。

2 个答案:

答案 0 :(得分:1)

泽西岛不知道如何将你的域对象序列化为八位字节流,除非你告诉它如何。在这种情况下,如果您想要在文件数据之外包含额外信息,您应该考虑应该如何阅读客户端。你可以:

  1. 通过创建自己的MessageBodyWriter将信息直接嵌入八位字节流中。客户端需要知道在结果文件中查找此信息的位置。

  2. 使用ResponseBuilder将信息作为HTTP响应标头的一部分包含在内。客户端只需知道要检查哪些响应标头信息。

答案 1 :(得分:0)

您可以使用multipart / *媒体类型在一封邮件中发送不同类型的数据。例如,本文将介绍如何:http://aruld.info/handling-multiparts-in-restful-applications-using-jersey/