Использование компонента внутри onException().onWhen()

#spring-boot #apache-camel

Вопрос:

Я использую эту книгу «Верблюд в действии 2-е издание». В нем приведен пример, в котором я использую руководство, чтобы поймать ошибку http и решить, что такое код состояния http. Однако я получаю сообщение об ошибке, указывающее на отсутствие метода «боб».

Пример доступен здесь, часть ошибок (p510) https://raw.githubusercontent.com/camelinaction/camelinaction2/master/errata.txt

Кстати, описание ошибки в ошибках-это не моя проблема. Я просто не могу скомпилировать код, когда у меня есть bean() внутри onWhen().

Что я здесь делаю не так?

EmailRouter.java

 .doTry()
    .log("Initial Header: ${headers.Authorization} ${body}")
    .to("https://test.net/rest/api/email")
.doCatch(HttpOperationFailedException.class)
    .onWhen(bean(FailureBean.class, "httpAuthFail"))  // Causes "The method bean(Class<FailureBean>, String) is undefined for the type EmailRouter"
    .log("Before InOnly: ${headers.Authorization} ${body}")
    .to("direct:dead?exchangePattern=InOnly")
    .setBody(simple("${headers.MessageBody}"))
    .setHeader("Authorization", exchangeProperty("token"))
    .log("Newly Set Header: ${headers.Authorization} ${body}")
    .to("https://test.net/rest/api/email")
.end()
 

FailureBean.java

 package com.bw.beans;

import java.util.Map;

import org.apache.camel.ExchangeException;
import org.apache.camel.Headers;
import org.apache.camel.http.base.HttpOperationFailedException;

public class FailureBean {

    public static boolean httpAuthFail(@ExchangeException HttpOperationFailedException cause) {
        int code = cause.getStatusCode();
        if (code == 401) {
            return true;
        }
        else {
            return false; 
        }
    }
}
 

Ответ №1:

bean Опция была удалена из языка верблюдов в Camel 3. Вы можете найти его (устаревший) в документах Camel 2.x.

Это просто означает, что вместо

 .onWhen(bean(FailureBean.class, "httpAuthFail"))
 

вы должны использовать method опцию

 .onWhen(method(FailureBean.class, "httpAuthFail"))
 

2-е издание Camel in Action было выпущено до Camel 3.x, поэтому некоторые примеры кода должны быть адаптированы для Camel 3.x. Руководство по миграции верблюдов может быть очень полезно для этого.