Изменение поведения фильтра scalatra

В моем приложении есть несколько фильтров, один из которых находится в корне.

<filter>
    <filter-name>root</filter-name>
    <filter-class>
        my.own.classpath.RootFilter
    </filter-class>
</filter>

<filter>
    <filter-name>root</filter-name>
    <filter-class>
        my.own.classpath.SubFilter
    </filter-class>
</filter>

<filter-mapping>
    <filter-name>root</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>sub</filter-name>
    <url-pattern>/sub/*</url-pattern>
</filter-mapping>

В Scalatra 2.0.0 это работало нормально. Если бы RootFilter (который расширяет ScalatraFilter) имел привязку к URL-адресу, он обработал бы его, в противном случае он перешел бы к другим фильтрам. Однако в более поздних версиях Scalatra это работает иначе. Когда я указываю URL-адрес, обработанный SubFilter, правильный фильтр по-прежнему вызывается, но результирующий текст не отображается. Вместо этого возвращается пустая страница (без HTML).

Это ошибка в Scalatra или я что-то не так делаю?


person schmmd    schedule 04.04.2012    source источник
comment
какая у вас версия Скалатра? 2.10 в разработке, 2.0.4 в стабильной версии или что-то еще? (читается как записанное сообщение ;-))   -  person virtualeyes    schedule 05.04.2012
comment
Мой сайт работает на Scalatra 2.0.0. Мой сайт не работает на Scalatra 2.0.1 и 2.0.4. Я взял эти фразы в кавычки, потому что не уверен, использую ли я ошибку или функцию, хотя думаю, что последнее.   -  person schmmd    schedule 05.04.2012


Ответы (1)


Я не уверен, Scalatra не движется в темпе Java, поэтому все меняется.

Вот фрагмент из книги Scalatra Book v2.0 о ScalatraServlet и ScalatraFilter; здесь может быть некоторая подсказка относительно того, в чем заключается проблема, особенно в отношении делегирования Not Found и ScalatraFilter следующему фильтру в цепочке (в вашем случае нет следующего фильтра после sub)

Основное отличие заключается в поведении по умолчанию, когда маршрут не найден. ScalatraFilter будет делегировать полномочия следующему фильтру или сервлету в цепочке (в соответствии с настройками web.xml), тогда как ScalatraServlet вернет ответ 404.

Еще одно отличие состоит в том, что ScalatraFilter сопоставляет маршруты относительно пути контекста WAR. ScalatraServlet сопоставляет маршруты относительно пути сервлета. Это позволяет вам монтировать несколько сервлетов в разных пространствах имен в одной и той же WAR.

Используйте ScalatraFilter, если:

You are migrating a legacy application inside the same URL space
You want to serve static content from the WAR rather than a dedicated web server    

Используйте ScalatraServlet, если:

You want to match routes with a prefix deeper than the context path.
person virtualeyes    schedule 05.04.2012
comment
Да, поэтому первая часть предполагает, что то, что я делаю, должно работать (делегировать следующему фильтру), а вторая часть предполагает, что это не должно работать (соответствует более глубокому префиксу). - person schmmd; 05.04.2012
comment
;-) Я люблю Scalatra, но нужно немного покопаться, ни одному из сопровождающих не платят (напрямую). Документация хорошая, но не отличная. ИМХО, это самая доступная/надежная микро-инфраструктура Scala (Spray и Unfiltered имеют хорошо покрытую нишу REST без сохранения состояния, но Scalatra, как правило, не мешает вам, дает вам состояние, если вы этого хотите, и супер легко трансформируется в стек MVC). В любом случае, рад был чем-то помочь! - person virtualeyes; 05.04.2012