Маршрутизация подпутей с сервлетами Guice - PullRequest
2 голосов
/ 16 ноября 2011

Я использую Guice для маршрутизации запросов в своем веб-приложении, и я хотел бы модульно настроить маршрутизацию некоторых шаблонов URL, которые я буду обрабатывать. В идеале я хотел бы иметь возможность сделать что-то подобное в моем ServletModule:

delegate("/foo/bar/*").to(SomeOtherServletModule.class);

// in SomeOtherServletModule.configureServlets:
serve("/foo/bar/quux").with(Quux.class);

Или даже лучше:

delegatePrefix("/foo/bar/").to(SomeOtherServletModule.class);

// in SomeOtherServletModule.configureServlets:
serve("/quux").with(Quux.class); // prefix removed

Возможно ли это в Guice? Кажется, что Guice изо всех сил старается сделать привязки, установленные ServletModules, синглтоном, который, в свою очередь, хранится в «кто знает где» с помощью GuiceServletContextListener для использования GuiceFilter, но я бы хотел отключить это Я могу делегировать вот так, вместо того, чтобы все было тесно связано в одной функции.

1 Ответ

3 голосов
/ 17 ноября 2011

Я создатель Guice Servlet. Как вы описываете, это, по сути, недопустимо, поскольку мы чувствовали, что это может привести к путанице для модулей, которые не предназначены для такого использования.

Например, многие модули предоставляют фильтры, которые регистрируются в «/ *» для обеспечения некоторых функций перехвата (таких как транзакции). Они могут случайно перестать работать, если вы автоматически префикс их. Учитывая, что модули сервлетов могут быть установлены транзитивно, это не так просто, как быть бдительным в отношении одного фрагмента кода. Кроме того, как с привязками регулярных выражений (пример: /\.html$/), как обрабатывать префиксы? Поддерживаем ли мы их (сложная проблема)? Или мы просто обычно регистрируем привязки регулярных выражений и делаем для них удивительное исключение?

Учитывая то, что вы запрашиваете, тривиально достигается с помощью конструктора в SomeOtherServletModule ("/ myprefix"), который знает, как правильно отображать себя, мы решили не предоставлять эту функцию.

...