Вы можете использовать пользовательское регулярное выражение для этого типа, но я рекомендую использовать правило перезаписи URL, чтобы добавить завершающий слеш, если он отсутствует. Вы должны выбрать один URL (с или без '/' в конце), в противном случае вы фактически обслуживаете одни и те же ресурсы с двумя разными адресами, и вы будете наказаны поисковыми системами и другими сканерами.
Для этого я бы использовал правило перезаписи, например, следующее:
<rewrite match="/questions/approved/[^/]+" trailingSlash="append" />
Это приведет к тому, что сервер обнаружит отсутствие символа «/» в конце URL-адреса, и перенаправит запрос в нужное место с символом «/» в конце.
Чтобы решить проблему enum, это немного сложнее. Обычно мы не рекомендуем связывать значения непосредственно в перечисления. В этом случае вы фактически не привязываетесь к перечислению (я предполагаю), но фактически привязываете значение URL-адреса буквенной строки в контексте EL области запроса. Затем это значение извлекается в другом месте вашего приложения, и именно здесь происходит преобразование в ENUM.
Пока не выйдет PrettyFaces 4, я рекомендую вместо этого связать значение в расположение String, а затем с помощью метода действия выполнить загрузку правильного значения самостоятельно, например, так:
<url-mapping id="approvedQuestions">
<pattern>/questions/approved/#{params.viewOption}/</pattern>
<view-id>/approved.xhtml</view-id>
<action>#{params.loadViewOption}</action>
</url-mapping>
Если вы хотите попробовать более продвинутый инструмент перезаписи URL, также от OCPsoft, вы можете использовать «Rewrite» (http://ocpsoft.com/rewrite/),, который является инструментом перезаписи URL на основе Java, но не так много интеграция с JSF.
PrettyFaces 4 будет основан на переписывании в качестве ядра, после чего все функции, которые вы используете в настоящее время, также будут доступны с возможностью делать что-то более похожее на это, что вам и нужно, если я не ошибаюсь:
.addRule(Join.path("/questions/approved/{viewOption}").to("/approved.xhtml")
.where("viewOption")
.matches("[^/]+/?")
.transformedBy(TrailingSlash.append())
.transformedBy(To.upperCase())
Вам нужно будет создать свои собственные преобразователи, потому что они еще не определены в библиотеке, но это общая идея. Он гораздо мощнее, чем в настоящее время возможно с PrettyFaces, но не обеспечивает той же интеграции навигации JSF, и его немного сложнее настроить.
Надеюсь, это поможет,
~ Линкольн