Camel 将多部分正文转换为java对象

lyfkaqu1  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(205)

我正在尝试使用java + camel读取一个多部分文件,并将其转换为对象来处理它。我的多部分文件由两种数据组成:一个application/json和一个application/octet-stream有没有办法把它转换成我可以使用的某种对象呢?基本上我是在向一个应用程序发送一个get REST请求,这个应用程序用一个多部分文件来响应。将应用程序/json添加到我的POJO,并将应用程序/octet-stream添加到DataHandler

pgx2nnw8

pgx2nnw81#

要在Camel中处理多部分,可以使用unmarshal().mimeMultipart()。在此行之后,Camel Exchange包含一个AttachmentMessage,它的主体是多部分的第一部分。可以通过在Camel处理器中调用attachmentMessage.getAttachmentObjects()来获得后面的部分。有关unmarshal().mimeMultipart()如何工作的更多信息,请参阅org.apache.camel.dataformat.mime.multipart.MimeMultipartDataFormatunmarshall()方法的源代码。进一步的操作取决于您的情况。例如,如果多部分的第一部分总是包含SimplePojo类的json对象,那么您可以在unmarshal().mimeMultipart()之后立即使用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--

Camel 路线构建器:

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>

相关问题