java - Jersey (REST) RESPONSE 多部分/混合多个 body 部分

标签 java rest jersey jax-rs

我有一个基于 jersey 的 web 服务,它产生如下“多部分/混合”响应:该方法读取一个文件,并应以八位字节格式返回它。此外,它读取该文件的元数据并以 json 格式返回它们。

方法:

    @GET
            @Produces("multipart/mixed")
            public Multipart getDocumentContents(@Context HttpHeaders header){
        ....
        ....
        ....
        os = new ByteArrayOutputStream();
        ....
        ....
MultiPart multiPartEntity = new MultiPart()
            .bodyPart(new BodyPart(os.toByteArray(), MediaType.APPLICATION_OCTET_STREAM_TYPE));

            return multiPartEntity;
        }

我的问题是我收到以下对我来说没有意义的错误:

A message body writer for Java class com.sun.jersey.multipart.MultiPart, and Java type class com.sun.jersey.multipart.MultiPart, and MIME media type multipart/mixed was not found
06.08.2013 15:32:06 com.sun.jersey.spi.container.ContainerResponse write
SCHWERWIEGEND: The registered message body writers compatible with the MIME media type are:
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
  com.sun.jersey.core.impl.provider.entity.DocumentProvider
  com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider
  com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONWithPaddingProvider
  com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
  com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy

据我所知,os.toByteArray() 正在将我的对象转换为字节数组。

有什么想法吗?

编辑:我正在使用 Jersey 1.15

最佳答案

错误消息告诉你两件事:

A message body writer for Java class com.sun.jersey.multipart.MultiPart was not found

这是因为 jersey 正在尝试将 MultiPart 类型转换为可以通过线路发送回客户端的二进制表示

MIME media type multipart/mixed was not found

这表示 multipart/mixed 不是有效的媒体类型

MediaType java 类型对于每个可接受的媒体类型都有常量...您可以使用 @Produces(MediaType.MULTIPART_FORM_DATA) 但这不是您想要的

我认为一个解决方案(不是 testet)可能是:

1- 为每个要返回的文件定义一个包含 byte[] 的自定义类型,例如(使用 lombok)

@XmlRootElement(name="returnedFiles")
@Accessors(prefix="_")
@NoArgsConstructor
public class ReturnedFiles {
    @XmlElement(name="file1Contents")
    @Getter @Setter private byte[] _file1Contents;
    @XmlElement(name="file1Name")
    @Getter @Setter private String _file1Name;

    @XmlElement(name="file1Contents")
    @Getter @Setter private byte[] _file2Contents;
    @XmlElement(name="file1Name")
    @Getter @Setter private String _file2Name;
}

2- 重新定义你的方法

@GET @Path("{myPath}") 
@Produces(MediaType.APPLICATION_XML)
public Response getDocumentContents(@Context HttpHeaders header) {
    ... load the files and compose the ReturnedFiles instance
    return Response.ok()
                   .entity(returnedFilesInstance)
                   .build();
}

关于java - Jersey (REST) RESPONSE 多部分/混合多个 body 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18081982/

相关文章:

java - 可变数量参数不允许使用旧数组表示法

java - 可以在单个 JFrame 中的项目上使用多种颜色吗?

java - Android ksoap2 通过 https

php - 使用 CURLOPT_POSTFIELDS 发布文件时文件为空

java - 使用冒号时将类 @Path 注释连接到方法 @Path 注释

grails - 我可以在 Grails 的接口(interface)类中使用 JAXRS 注释(例如 @Produces)吗

java - 使用 Java 检测另一台设备上的端口是否打开

Java Spring Rest API。返回引用的对象或对象的 id?

jersey - Weblogic:禁用 Jersey 扫描

javascript - angularjs ng-show 与新模板