Как настроить маршрут в Java, который использует ссылки bean

Я пытаюсь настроить следующий маршрут:

  @Override
    public void configure() throws Exception {
        log.info("Creating ftp rout from " + config.ftpUrl().split("\\?")[0]);
        from(config.ftpUrl()
             + "&stepwise=true"
             + "&delay=1000"
             + "&move=${file:name}.trans"
             + "&recursive=true"
             + "&binary=true"
             + "&filter=#" + Beans.doneFilter.name()
             + "&maxMessagesPerPoll=200"
             + "&eagerMaxMessagesPerPoll=false"
             + "&sorter=#" + Beans.sorter.name())
                                                     .log("Downloading file ${file:name}")
                                                     .to("file:" + config.ftpTargetPostpaid())
                                                     .to("file:" + config.ftpTargetPrepaid())
                                                     .to("file:" + config.ftpTargetFonic())
                                                     //.routePolicyRef(Beans.policy.name())
                                                     .autoStartup(false)
                                                     .routeId("ftp");
    }

Ошибка:

Не удалось найти подходящий метод установки для свойства: фильтр, так как нет метода метода с таким же типом: java.lang.String или преобразование типа невозможно: нет доступных преобразователей типа для преобразования из типа: java.lang.String в требуемый тип: org.apache.camel.component.file.GenericFileFilter со значением #doneFilter

Я думаю, что способ, которым я ссылаюсь на связанный бин, неправильный? Я связал все бобы таким образом (автономное приложение):

public class MainApp {

/**
 * A main() so we can easily run these routing rules in our IDE
 */
public static void main(String... args) throws Exception {
    Injector i = Guice.createInjector(new CepModule());
    Main main = new Main();
    bindBeans(main);
    main.enableHangupSupport();
    main.addRouteBuilder(i.getInstance(FetchFtp.class));
    main.run();

}

private static void bindBeans(Main main) {
    for (Beans bean : Beans.values()) {
        main.bind(bean.name(), bean.clazz());
    }
}

/**
 * This is the java style bean registry. Use the enums name as reference to the bean.
 * 
 *
 */
public static enum Beans{
    sorter(SortingStrategy.class),
    policy(PolicyForStartAndStopRoutes.class),
    doneFilter(ExcludeDoneFilesFilter.class);

    private final Class<?> clazz;

    Beans(Class<?> clazz){
        this.clazz = clazz;;
    }

    public Class<?> clazz(){
        return clazz;
    }
}

}

Итак, как использовать бины / классы в маршрутах, настроенных в Java?

1 ответ

Решение

Верблюд ожидает не только class ссылки, но экземпляры бобов.

Предполагая, что классы имеют конструктор по умолчанию, связать bean.clazz().newInstance() в реестр вместо bean.clazz()т.е.

main.bind(bean.name(), bean.clazz().newInstance());
Другие вопросы по тегам