Как установить тело запроса в Camel Restlet? - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть простой метод получения Camel, и все, что я хочу сделать, это установить тело в результате преобразования XSL.Как мне это сделать?Следующий код не компилируется, но показывает, чего я хочу достичь:

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

1 Ответ

0 голосов
/ 08 декабря 2018

Вы можете использовать процессор, чтобы установить тело в качестве 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, но вы всегда можете использовать отдельный класс, если хотите.

Если вы хотите получить в сообщении источник вашего файла 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");
...