2016-04-19 6 views
1

Я создаю маршрут, используя Java DSL в Camel.

Я хотел бы выполнить замену текста без создания нового процессора или компонента.

У меня есть это:

.setHeader(MY_THING, 
    constant(my_template.replace("{id1}", simple("${header.subs_val}").getText()))) 

Если я не добавлять «постоянные» я получаю ошибки несоответствия типов. Если я не поставил getText() в части simple(), я получаю ответы на несоответствие текста. Когда я запускаю свой маршрут, он заменяет {id} буквами ${header.subs_val} вместо того, чтобы извлекать мое значение из заголовка. Тем не менее, если я удалю цитаты, я получаю ошибки компиляции; Конечно, Java не знает синтаксиса ${...}.

Развертывание занимает несколько минут, поэтому эксперименты дороги.

Итак, как я могу просто сделать простую замену. На самом деле я ничего не вижу в Интернете.

EDIT - что такое шаблон? В частности, строка (это URL)

http://this/that/{id1}/another/thing 

Я унаследовал некоторый код, поэтому я не могу просто to(...) URL-адрес и применить специальную .tof() (??) форматирование.

+1

Что такое my_template в вашем примере? – ltsallas

+1

И как my_templa т. е. связано с обменом? Если вам нравится предоставлять более подробную информацию, я пытаюсь воспроизвести дело. Я понимаю, что вы хотите заменить параметр с именем id в шаблоне содержимым header.subs_val, но я не могу понять, что такое шаблон. – ltsallas

+0

@ltsallas Редактировано –

ответ

2

Интересный случай!

Если вы поместите my_template в заголовок, вы можете использовать вложенное простое выражение (Camel 2.9 onwards), как в приведенном ниже примере. Я также устанавливаю значение для subs_val для примера, но я полагаю, что ваш заголовок уже имеет значение в маршруте.

.setHeader("my_template", constant("http://this/that/{id1}/another/thing")) 
    .setHeader("subs_val",constant("22")) 
    .setHeader("MY_THING",simple("${in.header.my_template.replaceAll(\"\\{id1.?\",${in.header.subs_val.toString()})}")) 

После этого шага заголовка MY_THING имеет значение http://this/that/22/another/thing.

1) В этом примере я мог бы пропустить to_String(), но я не знаю, каков тип вашего заголовка «subs_val».

2) Я попытался сначала заменить replaceAll (\ "\ {id1 \"} \ "), но это не сработало с} Вероятно, это ошибка ... Посмотрите на нее снова. Вот почему в моем регулярном выражении Я использовал.?

3) при отладке приложения внутри процессора, где обмен доступен вы можете использовать SimpleBuilder оценить простое выражение легко в вашем IDE, без необходимости перезагрузки вашего приложения

SimpleBuilder.simple("${in.header.url.replaceAll(\"\\{id1.?\",${in.header.subs_val.toString()})}").evaluate(exchange, String.class); 

Надеюсь, что это помогло :)

+0

Спасибо. Хотя нет никаких оснований для того, чтобы шаблон находился в заголовке, также не повредит что-либо.Ваша замена выше намного чище, чем использование реализации Процессора, что я и делал. –

+0

Я только что прочитал ваш последний комментарий, что шаблон вводится. Простой язык предлагает множество различных параметров для чтения значений (внешние свойства, компоненты и т. Д.) См. Переменные в https://camel.apache.org/simple.html. Возможно, один из этих вариантов более чист. Если вам нравится добавлять части вашего маршрута (в частности, эту часть вставки шаблона), чтобы мы могли выяснить, может ли одно из других доступных простых значений выражения помочь избежать этого параметра в заголовке обмена – ltsallas

+0

Я вижу, что это было бы еще чище , –

Смежные вопросы