Как проверить наличие действия в пространстве имен в Struts2? - PullRequest
0 голосов
/ 04 августа 2010

Я хотел бы внедрить в веб-приложение Struts2 своего рода "запасной вариант" URL-адреса, используя собственный ActionMapper.Это означает:

когда

http://server/webapp/foo/bar/myaction

не существует, я хочу, чтобы ActionMapper попытался загрузить, например,

http://server/webapp/foo_fallback/bar/myaction

.

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

Есть ли возможность проверить, существует ли действие в пространстве имен (в данном случае / foo / bar)?Или есть другой механизм для выполнения того, что я собираюсь сделать?

Спасибо,

Грегор

Ответы [ 2 ]

0 голосов
/ 12 августа 2010

Я решил свою проблему. Это происходит в пользовательском ActionMapper:

Чтобы выяснить, существует ли действие, я сначала создаю строку с именем класса (включая пространство имен) нужного действия. Тогда я звоню

Class.forName("namespaceroot.foo.bar.myaction");

Если действие не существует, выдается исключение ClassNotFoundException, которое я могу проверить в блоке try { ... } catch { ... }. Внутри блока catch я могу изменить пространство имен сопоставления на резервное пространство имен. Это имеет некоторые последствия для ActionProxy: пространство имен также должно быть изменено в getMappingFromActionName. В противном случае ActionProxy содержит пространство имен запроса, что обычно нормально. DefaultActionProxy не имеет установщика для пространства имен, поэтому я вложил его в подкласс и создал его, используя пользовательский AxtionProxyFactory. Уф.

Это не элегантно, имхо, но пока у меня нет идеи получше, она останется такой. Я хотел бы услышать лучшее решение!

0 голосов
/ 04 августа 2010

Это необходимо сделать для каждого настроенного пространства имен:

<action name="*">
    <result type="redirectAction">your fallback action here</result>
</action>

Если это не работает, установите struts.enable.SlashesInActionNames на false.

...