Apache Camel: Как получить сообщение об исключении внутри блока doCatch ()? - PullRequest
0 голосов
/ 26 ноября 2018

Мне нужно вернуть сообщение из брошенного исключения или поместить его в сообщение.Но он не печатает правильное сообщение на веб-интерфейсе.

Документы на верблюдах предлагают использовать .transform(simple?...) .handled(true), но большинство из них устарело.

Какой правильный способ сделать это?

Ответ:
<418 I'm a teapot,simple{${exception.message}},{}>


Маршрут

from("direct:csv")
  .doTry()
    .process(doSomeThingWithTheFileProcessor)
  .doCatch(Exception.class)
    .process(e -> {
        e.getOut().setBody(new ResponseEntity<String>(exceptionMessage().toString(), HttpStatus.I_AM_A_TEAPOT));
    }).stop()
  .end()
  .process(finalizeTheRouteProcessor);


doSomethingWithFileProcessor

public void process(Exchange exchange) throws Exception {
        String filename = exchange.getIn().getHeader("CamelFileName", String.class);

        MyFile mf = repo.getFile(filename); //throws exception

        exchange.getOut().setBody(exchange.getIn().getBody());
        exchange.getOut().setHeader("CamelFileName", exchange.getIn().getHeader("CamelFileName"));
    }

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

В doCatch () Camel перемещает исключение в свойство на обмене с ключом Exchange.EXCEPTION_CAUGHT (http://camel.apache.org/why-is-the-exception-null-when-i-use-onexception.html).

, поэтому вы можете использовать

e.getOut().setBody(new ResponseEntity<String>(e.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class).getMessage(), HttpStatus.OK));
0 голосов
/ 26 ноября 2018

Есть много способов, как это сделать.Все правильно, выберите ваш любимый в зависимости от сложности обработки ошибок.Я опубликовал примеров в этой сущности .Ничто из этого не считается устаревшим в верблюжьей версии 2.22.0.

с процессором

from("direct:withProcessor")
        .doTry()
            .process(new ThrowExceptionProcessor())
        .doCatch(Exception.class)
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    final Throwable ex = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
                    exchange.getIn().setBody(ex.getMessage());
                }
            })
        .end();

с простым языком

from("direct:withSimple")
        .doTry()
            .process(new ThrowExceptionProcessor())
        .doCatch(Exception.class)
            .transform().simple("${exception.message}")
        .end();

С setBody

from("direct:withValueBuilder")
        .doTry()
            .process(new ThrowExceptionProcessor())
        .doCatch(Exception.class)
            .setBody(exceptionMessage())
        .end();
...