Разница в использовании Mule MEL

Я использую различные формы языка Mule Expression. Я не мог понять разницу между

#[flowVars.myVariable]  

и

#[flowVars['myVariable']]

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

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

Почему эта разница?

Также, просматривая документацию по Mule 3.6, я обнаружил, что второе выражение больше не отображается в документации.

Является ли выражение #[flowVars['myVariable']] устаревшим?


person user1760178    schedule 07.04.2015    source источник


Ответы (2)


Разница заключается в том, как MVEL работает с этими двумя разными способами доступа к записям карты.

  • #[flowVars['myVariable']] эквивалентно flowVars.get('myVariable'), что не дает сбоя, если карта flowVars не содержит запись 'myVariable',
  • #[flowVars.myVariable] обрабатывает карту flowVars как виртуальный объект, что приводит к исключению, если запись 'myVariable' отсутствует, потому что в этом случае она не разрешается в карту get, а вместо этого напрямую использует элемент объекта (либо поле, либо метод), который должен существовать перед доступом.

Я не думаю, что #[flowVars['myVariable']] может быть объявлено устаревшим, поскольку это основная функция, предоставляемая MVEL.

Ссылка: http://mvel.codehaus.org/MVEL+2.0+Property+Navigation#MVEL2.0PropertyNavigation-MapAccess

person David Dossot    schedule 07.04.2015
comment
Спасибо за объяснение. Но нет никакого упоминания об использовании стиля #[flowVars['myVariable']] в текущей (3.6) документации Mule. mulesoft.org/documentation/display/current/ - person user1760178; 08.04.2015
comment
Но некоторые выражения MEL, работавшие в более ранних версиях Mule, не работают в Mule 3.6.1, например #[header:originalFilename] внутри файла: inbound-endpoint не работает в mule 3.6.1. - person user1760178; 08.04.2015
comment
#[header:originalFilename] — это не MEL, это старый формат выражения (т. е. «вычислитель: выражение»), который устарел, начиная с Mule 3.3. И я понятия не имею, почему синтаксис #[flowVars['myVariable']] был удален из документа Mule... может быть, потому что это на самом деле функция MVEL, поэтому для него не нужен какой-либо конкретный документ? В версии 3.6 есть множество тестов, использующих этот синтаксис: github.com/mulesoft/mule/ - person David Dossot; 08.04.2015

Дэвид дал хорошее объяснение вашего вопроса. Чтобы расширить это объяснение, я просто хотел бы добавить, что вы можете использовать #[flowVars.?myVariable], чтобы сделать ваш код нулевым безопасным. Это эквивалентно #[flowVars['myVariable']].

Что касается #[header:originalFilename], как сказал Дэвид, это не MEL. Вы можете получить список выражений, отличных от mel, которые обычно используются в приложениях Mule, по следующей ссылке.

http://www.mulesoft.org/documentation/display/current/Non-MEL+Expressions+Configuration+Reference

person Rupesh Sinha    schedule 08.04.2015