我正在尝试用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未找到
我哪里错了?这是管理此案例的正确方法吗?我的客户不能成为“泽西客户”。
答案 0 :(得分:1)
泽西岛不知道如何将你的域对象序列化为八位字节流,除非你告诉它如何。在这种情况下,如果您想要在文件数据之外包含额外信息,您应该考虑应该如何阅读客户端。你可以:
通过创建自己的MessageBodyWriter将信息直接嵌入八位字节流中。客户端需要知道在结果文件中查找此信息的位置。
使用ResponseBuilder将信息作为HTTP响应标头的一部分包含在内。客户端只需知道要检查哪些响应标头信息。
答案 1 :(得分:0)
您可以使用multipart / *媒体类型在一封邮件中发送不同类型的数据。例如,本文将介绍如何:http://aruld.info/handling-multiparts-in-restful-applications-using-jersey/