@WebFilter разные параметры инициализации для разных типов

Я нахожусь в середине переноса веб-приложения на основе Servlet 2.5 на Servlet 3.0 и столкнулся с этой проблемой, что я не знаю, как сжать эти разные сопоставления фильтров в одну аннотацию @WebFilter для класса.

Фильтры:

<!-- Day is 12 hours, so if we update at night the new content will be fetched first     thing in the morning -->
<filter>
    <filter-name>CacheForDay</filter-name>
    <filter-class>x.web.client.filter.CacheHeaderFilter</filter-class>
    <init-param>
        <param-name>CacheTime</param-name>
        <param-value>43200</param-value>
    </init-param>
</filter>

<filter>
    <filter-name>CacheForWeek</filter-name>
    <filter-class>x.web.client.filter.CacheHeaderFilter</filter-class>
    <init-param>
        <param-name>CacheTime</param-name>
        <param-value>604800</param-value>
    </init-param>
</filter>

<filter>
    <filter-name>CacheForMonth</filter-name>
    <filter-class>x.web.client.filter.CacheHeaderFilter</filter-class>
    <init-param>
        <param-name>CacheTime</param-name>
        <param-value>18144000</param-value>
    </init-param>
</filter>

<filter>
    <filter-name>noCache</filter-name>
    <filter-class>x.web.client.filter.CacheHeaderFilter</filter-class>
    <init-param>
        <param-name>CacheTime</param-name>
        <param-value>0</param-value>
    </init-param>
</filter> 

Сопоставления фильтров:

<filter-mapping>
    <filter-name>CacheForDay</filter-name>
    <url-pattern>*.png</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>CacheForDay</filter-name>
    <url-pattern>*.gif</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>CacheForDay</filter-name>
    <url-pattern>*.js</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>CacheForDay</filter-name>
    <url-pattern>*.css</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>CacheForMonth</filter-name>
    <url-pattern>*.ico</url-pattern>
  </filter-mapping>

Как я могу заменить их на @WebFilter?


person lexz    schedule 17.09.2013    source источник


Ответы (1)


Это невозможно с одним классом, аннотированным @WebFilter. Вам придется либо:

  • Продолжайте использовать способ web.xml; это не плохо, учитывая ситуацию.
  • Реализуйте логику в базовом классе и напишите тривиальные расширения, аннотированные соответствующим @WebFilter. Я думаю, это будет некрасиво.

Пример более позднего:

public class BaseCacheFilter implements Filter
{
    public void doFilter(...) {
        ...implementation here...
    }
    ....
}

@WebFilter(
    urlPatterns={"*.png","*.gif",...},
    initParams=@WebInitParam(name="CacheTime",value="43200")
)
public class CacheForDay extends BaseCacheFilter
{ /* EMPTY */ }
person Nikos Paraskevopoulos    schedule 17.09.2013