Java Rest Jersey:发布多种类型的数据(文件和JSON)



>我有一个泽西岛REST服务,数据将被发布到该服务。将有一个CSV文件,该文件是实际数据和该CSV的一些元数据(元可以是JSON或XML格式)。如果两者都需要发布,服务的方法签名和随附注释应该是什么样子,它应该是这样的......

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces({MediaType.APPLICATION_JSON})
public CreateTaskVO provideService(@FormParam("meta") String v1,
        @FormParam("data") InputStream v2) {

在这里,我设想第一个参数是元数据的 JSON 字符串,第二个参数是实际数据的输入流。这行得通吗?

你应该使用一些多部分格式。它基本上由 multipart/xxx 类型的单个消息组成(其中 xxx 可以是类似 form-data ),并且该消息由具有自己的内容类型和其他元数据的其他"完整"消息组成。

您尚未指定哪个 Jersey 版本,但从 Jersey 2.x.x 开始,以单独工件的形式提供了多部分支持:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
    <version>${jersey.version}</version>
</dependency>

然后,只需注册该功能,如此处的注册所示。

然后你可以只使用@FormDataParam

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces({MediaType.APPLICATION_JSON})
public CreateTaskVO provideService(
               @FormDataParam("meta") String jsonMeta,
               @FormDataParam("data") InputStream file,
               @FormDataParam("data") FormDataContentDisposition fileDetail) {

您可以在此处看到如何从客户端发送数据的示例,以及多部分的内部消息正文格式

其他内容:

  • 泽西岛多部件支持的一般信息
  • 关于multipart/form-data的一般信息
  • JAX-RS 发布多个对象

更新

在泽西岛 1.x.x 中也支持多部分,以这个工件的形式出现

<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-multipart</artifactId>
    <version>${jersey.version}</version>
</dependency>

最新更新