将多部分正文转换为 java 对象
Convert multipart body to java object
我正在尝试使用 java + camel 读取多部分文件并将其转换为对象以对其进行处理。
我的多部分文件由两种数据组成:application/json 和 application/octet-stream
有没有办法将它转换为我可以使用的某种对象?
基本上,我正在向使用多部分文件响应的应用程序发送 get REST 请求。我不知道如何将响应主体转换:application/json 到我的 POJO 和 application/octet-stream 到 DataHandler
要在 camel 中处理多部分,您可以使用 unmarshal().mimeMultipart()
。在这一行之后,Camel Exchange 包含一个 AttachmentMessage
,它的 body 是 multipart 的第一部分。接下来的部分可以通过在 Camel 处理器中调用 attachmentMessage.getAttachmentObjects()
来获得。有关 unmarshal().mimeMultipart()
工作原理的更多信息,请参阅 org.apache.camel.dataformat.mime.multipart.MimeMultipartDataFormat
中方法 unmarshall()
的源代码。
进一步的行动取决于您的情况。例如,如果 multipart 的第一部分总是包含 SimplePojo
class 的 json object,那么您可以在 [=15] 之后立即使用 unmarshal().json(SimplePojo.class)
=].然后 Camel body 将包含您的 pojo。接下来部分的DataHandlers可以通过以下方式获得:
DataHandler dataHandler = attachmentObjects.get("test.txt").getDataHandler();
// test.txt comes from the filename field of the Content-Disposition header in case you have multipart/form-data.
下面是处理来自位于 {{http.url}} 的 REST 服务的响应的示例,采用以下形式的多部分格式:
--Boundary_2411_1961957611_1491990591774
Content-Disposition: form-data; name="part1"
Content-Type: application/json; charset=utf-8
{
"id": 123,
"name": "simple pojo"
}
--Boundary_2411_1961957611_1491990591774
Content-Disposition: form-data; name="part2"; filename="test.txt"
Content-Type: application/octet-stream
test
--Boundary_2411_1961957611_1491990591774--
骆驼RouteBuilder:
from("direct:start")
.setHeader(Exchange.HTTP_METHOD, constant(HttpMethods.GET))
.to("{{http.url}}")
.unmarshal().mimeMultipart()
.unmarshal().json(SimplePojo.class)
.process(exchange -> {
AttachmentMessage attachmentMessage = exchange.getMessage(AttachmentMessage.class);
SimplePojo simplePojo = attachmentMessage.getBody(SimplePojo.class);
Map<String, Attachment> attachmentObjects = attachmentMessage.getAttachmentObjects();
DataHandler dataHandler = attachmentObjects.get("test.txt").getDataHandler();
})
.to("mock:end");
简单的Pojo:
public class SimplePojo {
private Long id;
private String name;
//...
//getters, setters
}
为了使 unmarshal().mimeMultipart()
和 unmarshal().json(SimplePojo.class)
工作,您必须具有依赖项:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mail</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>${camel.version}</version>
</dependency>
我正在尝试使用 java + camel 读取多部分文件并将其转换为对象以对其进行处理。 我的多部分文件由两种数据组成:application/json 和 application/octet-stream 有没有办法将它转换为我可以使用的某种对象? 基本上,我正在向使用多部分文件响应的应用程序发送 get REST 请求。我不知道如何将响应主体转换:application/json 到我的 POJO 和 application/octet-stream 到 DataHandler
要在 camel 中处理多部分,您可以使用 unmarshal().mimeMultipart()
。在这一行之后,Camel Exchange 包含一个 AttachmentMessage
,它的 body 是 multipart 的第一部分。接下来的部分可以通过在 Camel 处理器中调用 attachmentMessage.getAttachmentObjects()
来获得。有关 unmarshal().mimeMultipart()
工作原理的更多信息,请参阅 org.apache.camel.dataformat.mime.multipart.MimeMultipartDataFormat
中方法 unmarshall()
的源代码。
进一步的行动取决于您的情况。例如,如果 multipart 的第一部分总是包含 SimplePojo
class 的 json object,那么您可以在 [=15] 之后立即使用 unmarshal().json(SimplePojo.class)
=].然后 Camel body 将包含您的 pojo。接下来部分的DataHandlers可以通过以下方式获得:
DataHandler dataHandler = attachmentObjects.get("test.txt").getDataHandler();
// test.txt comes from the filename field of the Content-Disposition header in case you have multipart/form-data.
下面是处理来自位于 {{http.url}} 的 REST 服务的响应的示例,采用以下形式的多部分格式:
--Boundary_2411_1961957611_1491990591774
Content-Disposition: form-data; name="part1"
Content-Type: application/json; charset=utf-8
{
"id": 123,
"name": "simple pojo"
}
--Boundary_2411_1961957611_1491990591774
Content-Disposition: form-data; name="part2"; filename="test.txt"
Content-Type: application/octet-stream
test
--Boundary_2411_1961957611_1491990591774--
骆驼RouteBuilder:
from("direct:start")
.setHeader(Exchange.HTTP_METHOD, constant(HttpMethods.GET))
.to("{{http.url}}")
.unmarshal().mimeMultipart()
.unmarshal().json(SimplePojo.class)
.process(exchange -> {
AttachmentMessage attachmentMessage = exchange.getMessage(AttachmentMessage.class);
SimplePojo simplePojo = attachmentMessage.getBody(SimplePojo.class);
Map<String, Attachment> attachmentObjects = attachmentMessage.getAttachmentObjects();
DataHandler dataHandler = attachmentObjects.get("test.txt").getDataHandler();
})
.to("mock:end");
简单的Pojo:
public class SimplePojo {
private Long id;
private String name;
//...
//getters, setters
}
为了使 unmarshal().mimeMultipart()
和 unmarshal().json(SimplePojo.class)
工作,您必须具有依赖项:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mail</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>${camel.version}</version>
</dependency>