2015-07-07 4 views
0

Я пытаюсь добавить Jersey2 ContainerRequestFilter в webapp через web.xml. В настоящее время я всегда использую обозначение с сервлет, как описано here:Использование Jersey2 ContainerRequestFilter с фильтрацией в web.xml

<servlet> 
    <servlet-name>MyApplication</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     ... 
    </init-param> 
</servlet> 
... 
<servlet-mapping> 
    <servlet-name>MyApplication</servlet-name> 
    <url-pattern>/myApp/*</url-pattern> 
</servlet-mapping> 

Теперь в другом случае я не имеет сервлет, но приложение калитки работает на коте, что я хочу использовать фильтр. Так что я пытался использовать альтернативный фильтр нотации, описанный в той же статье, что и выше (пример 4.10):

<filter> 
     <filter-name>MyApplication</filter-name> 
     <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class> 
     <init-param> 
      ... 
     </init-param> 
    </filter> 
    ... 
    <filter-mapping> 
     <filter-name>MyApplication</filter-name> 
     <url-pattern>/myApp/*</url-pattern> 
    </filter-mapping> 

Я успешно использовал его с фильтром нотации Jersey1, но не могу заставить его работать с фильтром Jersey2 (это более актуально, поэтому я предпочитаю его по сравнению со старым).

К сожалению, я обнаружил, что эта функция довольно бедна. Может ли кто-нибудь помочь, если это может сработать, и если да, то как это сделать?

+1

Почему вы просто не добавляете аннотацию '@ Provider' в фильтр и не позволяете ей получить ее через сканирование так же, как все ваши классы ресурсов будут отсканированы для' @ Path'. См. 4.7.1.2. по вашей ссылке. –

+1

Спасибо за этот намек. Во всяком случае, мой фильтр уже @Provider аннотирован, но у меня есть несколько классов фильтров в пакете, и я не хочу, чтобы все они были применены. Фактически я использовал способ, описанный в 4.7.1.3, по ссылке. Оба дают 404 по запросу ... – tareq

ответ

0

Как уже упоминалось @peeskillet в комментариях, мне пришлось добавить аннотацию @Provider поверх фильтра, чтобы ее подхватили Джерси. Добавление этого ответа для тех, кто пытается найти решение. То же самое можно сделать и для ContainerResponseFilter.

import java.io.IOException; 

import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.container.ContainerResponseContext; 
import javax.ws.rs.container.ContainerResponseFilter; 
import javax.ws.rs.ext.Provider; 


@Provider 
public class LoggingFilter implements ContainerRequestFilter,ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     //DO Stuff 
    } 

    @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) 
      throws IOException { 
     //DO Stuff 
    } 
} 
Смежные вопросы