>我有一个泽西岛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>