将多部分正文转换为 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>