Маршрутизация подпутей с сервлетами Guice

Я использую 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 ответ

Решение

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

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

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

Другие вопросы по тегам