调用Jersey multipart / mixed POST端点时的HTTP 415 - MultiPart作为参数

时间:2017-09-19 21:54:53

标签: java rest jersey

我在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对象?

提前感谢您提供任何/所有帮助。

0 个答案:

没有答案