Какой обходной путь можно использовать с неоднозначными шаблонами подстановочных знаков в Struts (до версии 2.1.9)? - PullRequest
2 голосов
/ 16 ноября 2009

У меня проблема с поиском правильного шаблона подстановки для извлечения частей моего URL-адреса в параметры действия в Struts.

Так я настроил действие. Цель шаблона - захватить два последних элемента пути и затем все, что может им предшествовать.

<action name="**/*/*" class="com.example.ObjectAction">
  <param name="filter">{1}</param>
  <param name="type">{2}</param>
  <param name="id">{3}</param>
</action>

Вызов по URL-адресу channels/123/transmissions/456 Я получаю следующий результат (действие просто устанавливает входные параметры в POJO и возвращает его в виде XML):

<result>
    <filter>channels/123/transmissions</filter>
    <id/>
    <type>456</type>
</result>

Должно быть:

<result>
    <filter>channels/123</filter>
    <id>456</id>
    <type>transmissions</type>
</result>

Теперь, поскольку ** соответствует всем символам , включая косую черту, я предполагаю, что мой шаблон позволяет более чем одним способом соответствовать URL, и Struts выбирает тот, который оставляет id пустым. Определено ли где-нибудь поведение для нескольких возможных совпадений? Могу ли я сделать шаблон менее двусмысленным? Есть ли альтернативные способы сделать это?

Я использую Struts 2.0.8. Обновление до 2.1.9 дало бы мне соответствие регулярному выражению, но у меня возникли проблемы с зависимостями Struts и моей средой OSGi, когда я перешел после 2.0.8, поэтому я хотел бы сейчас придерживаться этой версии.

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Я думаю, что подстановочные знаки struts2 не были достаточно зрелыми на тот момент.
Здесь и здесь не дают никаких указаний по более сложным шаблонам. Но поскольку ** соответствует всем , включая косые черты, я думаю, что struts2 обрабатывает все до последнего слеша как единицу, следовательно, устанавливает его в качестве первого заполнителя и устанавливает последний подстановочный знак во второй. Вот почему третий заполнитель остается нулевым.
Я предлагаю вам обновить, так как (и вы прекрасно это знаете) распорки 2.1+ обеспечивают сопоставление с образцом, что может быть более полезным в вашем случае.

0 голосов
/ 16 ноября 2009

Это более общий совет, чем специфический для структур, но здесь идет.

Если вы добавите дополнительный / к URL (что может быть сделано автоматически в какой-то момент в вашей структуре тестирования), то жадным результатом будет то, что вы видите.

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

РЕДАКТИРОВАТЬ: Чтобы ответить на общий вопрос, трудно сказать, является ли совпадение жадным или нет, так как часто парсеры возвращают первый «действительный» результат, который может быть эквивалентен жадному в зависимости от того, где у вас есть это.

...