我在Jersey中实现一个REST端点,它应该使用以下格式的多部分/混合请求:
content-type: multipart/mixed; boundary=--Boundary20171230945619789
manifest: ["Type1","Type2","Type3"]
content-length: 325
----Boundary20171230945619789
Content-Type: application/json
["string1","string2","string3"]
----Boundary20171230945619789
Content-Type: application/json
["string4","string5","string6"]
----Boundary20171230945619789
Content-Type: application/json
["string7","string8","string9"]
----Boundary20171230945619789--
"清单" header字段包含用于处理每个正文部分的模式的字符串键的JSON数组。
当我尝试按如下方式实现请求时:
@Path("request/test/post")
@POST
@Consumes("multipart/mixed")
public Response tryPost(MultiPart multi) { ... }
我收到HTTP 415错误:
2017-09-19 17:34:32.006 [http-nio-9909-exec-1]错误 com.sun.jersey.spi.container.ContainerRequest:460 - 消息正文 读者Java类org.glassfish.jersey.media.multipart.MultiPart, 和Java类类org.glassfish.jersey.media.multipart.MultiPart, 和MIME媒体类型multipart / mixed; boundary = - 找不到Boundary20171230945619789。已注册 与MIME媒体类型兼容的邮件正文阅读器是:* / * - > 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 $一般 com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider $ StreamSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider $ SAXSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider $ DOMSourceReader com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider $一般 com.sun.jersey.core.impl.provider.entity.XMLListElementProvider $一般 com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider $一般 com.sun.jersey.core.impl.provider.entity.EntityHolderReader
Jersey / Jackson不能将请求正确解析为MultiPart对象。如果我将签名更改为:
@Path("request/test/post")
@POST
@Consumes("multipart/mixed")
public Response tryPost(@HeaderParam("Manifest") String manifest, String rqBody){
//etc here...
}
它工作正常 - manifest
填充了头字段中的JSON(可以很容易地反序列化为List或String of String),rqBody
正确填充了请求体。但是,要以这种方式使用请求体,我将不得不做一些丑陋的(并且陷入困境)解析和标记化。
我已使用MultiPartFeature
注册ResourceConfig
课程,并尝试了其他大多数看似有用的选项。我在泽西岛看到的几乎所有例子都使用了multipart / form-data;即使是Jersey文档本身也基本上没有消耗多部分/混合请求的端点的例子,超出了粗略的部分。
有谁知道这里的问题是什么?如何正确实现端点方法以便能够将请求读入MultiPart对象?
提前感谢您提供任何/所有帮助。