Java 骆驼发送多部分/表单数据请求

Java 骆驼发送多部分/表单数据请求,java,apache-camel,Java,Apache Camel,我有一个发送多部分/表单数据的应用程序&一个接收多部分/表单数据请求的应用程序 在接收器中处理: InputStreamCache postBody = exchange.getIn().getBody(InputStreamCache.class); MultipartUploadContext mux = new MultipartUploadContext(postBody, exchange.getIn().getHeader("Content-Type",String.

我有一个发送多部分/表单数据的应用程序&一个接收多部分/表单数据请求的应用程序

在接收器中处理:

    InputStreamCache postBody = exchange.getIn().getBody(InputStreamCache.class);
    MultipartUploadContext mux = new MultipartUploadContext(postBody, exchange.getIn().getHeader("Content-Type",String.class));
    Map<String,Object> params = mux.parseRequest();
发送方处理器:

MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder
                .create()
                .addTextBody("name", "SomeName")
                .addBinaryBody("content", array_with_byte_content_here);
exchange.getOut().setBody(multipartEntityBuilder.build());
出现以下错误:

 No body available of type: java.io.InputStream but has value: org.apache.http.entity.mime.MultipartFormEntity@35315261 of type: org.apache.http.entity.mime.MultipartFormEntity on: Message[ID-VRN26-1529401997491-0-3]. Caused by: No type converter available to convert from type: org.apache.http.entity.mime.MultipartFormEntity to the required type: java.io.InputStream with value org.apache.http.entity.mime.MultipartFormEntity@35315261.
在查找同一问题后,我发现了一项建议,建议将正文更改为:

 exchange.getOut().setBody(multipartEntityBuilder.build().getContent());
但是,它会导致接收器端出现问题:

the request was rejected because no multipart boundary was found\r\n\tat org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:990)\r\n\tat org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:310)\r\n\tat org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:334)\r\n\tat ru.cinimex.abb.fileuploader.util.MultipartUploadContext.parseRequest(MultipartUploadContext.java:29)\r\n\tat ru.cinimex.abb.fileuploader.camel.processors.ValidateFullUploadRequestProcessor.process(ValidateFullUploadRequestProcessor.java:33)\r\n\tat org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)\r\n\tat org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)\r\n\tat 
请求被拒绝,因为找不到多部分边界\r\n\tat org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.(FileUploadBase.java:990)\r\n\tat org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:310)\r\n\tat org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:334)\r\n\tat ru.cinimex.abb.fileuploader.util.multipartPloadContext.parseRequest(multipartPloadContext.java:29)\r\n\tat ru.cinimex.abb.fileuploader.camel.processors.validateLuploadRequestProcessor.process(validateLuploadAddressProcessor.java:33)\r\n\tat org.apache.camel.processor.DelegateSyncProcessor.processor(DelegateSyncProcessor.java:63)\r\n\tat org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)\r\n\tat
我读过这些帖子:

但找不到解决办法


Camel版本:org.apache.Camel:Camel cxf:2.21.0.000033-fuse-000001-redhat-1

您需要使用正确的边界设置
内容类型
标题,该标题是在
MultipartEntityBuilder
中生成的。修改发送方处理器以设置此标题

HttpEntity resultEntity = multipartEntityBuilder.build();
exchange.getOut().setHeader(Exchange.CONTENT_TYPE, resultEntity.getContentType().getValue());
exchange.getOut().setBody(resultEntity.getContent());

谢谢,这解决了特殊问题。我能够在接收器端解析多部分数据。但我面临另一个问题:内容长度太长:565611在发送具有适当内容的请求时。供将来参考。如果您找到此答案,并且您正在使用
camel-http4
组件来生成
POST
多部分请求首先,有一种更简单的方法,无需手动设置
ContentType
标题。有关详细信息,请参阅此答案:
HttpEntity resultEntity = multipartEntityBuilder.build();
exchange.getOut().setHeader(Exchange.CONTENT_TYPE, resultEntity.getContentType().getValue());
exchange.getOut().setBody(resultEntity.getContent());