如何在Camel Restlet中设置请求正文?

时间:2018-12-08 11:13:52

标签: java apache-camel restlet

我有一个简单的Camel get方法,我要做的只是将主体设置为XSL转换的结果。我该怎么做呢? 以下代码无法编译,但是显示了我想要实现的目标:

rest("/api")
    .get("/booksByAuthor/{author}")
    .route()
    .setBody(
        from("file:/conf.xml")
        .setHeader("author",simple("${header.author}"))
        .to("xslt:/transformers/booksByAuthor.xsl")
    );

1 个答案:

答案 0 :(得分:2)

您可以使用处理器将主体设置为xml文件,然后将其传递给xslt。您不需要在消息正文中包含文件内容,只需文件的句柄就足以用于“ xslt:”。像

    rest("/api")
        .get("/booksByAuthor/{author}")
        .route()
        .process(exchange -> exchange.getIn().setBody(new File("/conf.xml")))
        .to("xslt:/transformers/booksByAuthor.xsl");

作者已经在消息标题中,因此您无需进行设置,就可以使用

在xslt中对其进行访问。
    <xsl:param name="author"/>
    <xsl:value-of select="$author"/>

我刚刚将处理器编写为Java 8 lambda,但是如果愿意,可以始终使用单独的类。

如果要将XML文件的源获取到消息中,而不是使用文件句柄,则可以使用pollEnrich来读取文件。然后,您需要使用一种聚合策略来确保您保留原始消息的标头。最简单的方法可能只是将带有xml的邮件正文复制到原始邮件。这是如何执行此操作的示例。

    rest("/api")
        .get("/booksByAuthor/{author}")
        .route()
        .pollEnrich("file:/?fileName=conf.xml&noop=true", (original, xml) -> {
                original.getIn().setBody(xml.getIn().getBody());
                return original;})
        .to("xslt:/transformers/booksByAuthor.xsl");