Можно ли определить фильтр Java EE6 с помощью аннотации, но применить его в файле web.xml? - PullRequest
2 голосов
/ 08 января 2012

Я написал фильтр, который, как мне кажется, будет полезен во многих веб-приложениях.Я хотел бы поместить его в библиотеку (упакованную в виде файла jar), чтобы его можно было распространять и использовать.Однако я не хочу заставлять пользователей библиотеки использовать ее (это всего лишь одна из множества замечательных вещей).

На данный момент фильтр выглядит так:

public class WonderfulFilter implements Filter {

Это означает, что для его применения пользователи должны добавить в свой web.xml следующее:

<filter>
    <filter-name>WonderfulFilter</filter-name>
    <filter-class>org.example.WonderfulFilter</filter-class>
</filter>

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

В новом, смелом мире EE6 это выглядит неловко.

Если яопределите фильтр следующим образом:

@WebFilter("/*")
public class WonderfulFilter implements Filter {

Тогда для применения фильтра не требуется никакой конфигурации.Но также нет возможности не применить фильтр.

Что я могу сделать?Есть ли способ аннотировать фильтр, чтобы определить его шаблон URL (и другие свойства) без неявного применения?Есть ли какой-нибудь способ легко отключить фильтр в файле web.xml?

(может быть что-то вроде решения, включающего web-фрагмент.xml; рассмотрим это ...)

Ответы [ 2 ]

1 голос
/ 08 января 2012

Часть аннотации @WebFilter, которая применяет фильтр, является атрибутом urlPatterns.Если это пропустить, фильтр не будет применен ни к каким запросам.

Таким образом, класс может быть объявлен:

@WebFilter(filterName = "WonderfulFilter")
public class WonderfulFilter implements Filter {

И в файле web.xml приложения пользователь можетзатем напишите:

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

Да, они все равно должны сами предоставить сопоставление, включая шаблон URL.Но, по крайней мере, им не нужно писать определение фильтра.Поэтому они изолированы от конкретного имени класса фильтра и освобождаются от ответственности за предоставление любых обязательных init-параметров.

Это не так уж и много улучшений.

1 голос
/ 08 января 2012

Вы можете отправить свой веб-фильтр с аннотацией, но его поведение будет активировано / деактивировано с помощью свойства externalizable. Из вашего описания кажется, что веб-фильтр должен быть неактивен по умолчанию, что имеет смысл. Просто добавьте документацию, в которой третьи лица знают, какое свойство им нужно включить, чтобы включить фильтр.

...