Как настроить маршрут в 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());