2014-01-09 4 views
2

Я не могу запустить фильтр запросов. Я запускаю причал 9.1 в качестве встроенного сервера.Фильтр запросов не работает в Jersey 2 on Embedded Jetty

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

@Provider 
public class MyFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext arg0) throws IOException { 
     System.out.println("HEY HO"); 
    } 
} 

Я зарегистрировал этот класс в ResourceConfig, также попытался зарегистрировать пакет. Это просто игнорируется. Это ошибка, или я чего-то не хватает?

Это, как я начинаю Jetty:.

Weld weld = new Weld(); 
WeldContainer container = weld.initialize(); 

URI baseUri = UriBuilder.fromUri("http://localhost/").port(8080).build(); 
ResourceConfig config = ResourceConfig.forApplicationClass(MyApplication.class); 

Server server = JettyHttpContainerFactory.createServer(baseUri, config); 

(MyApplication расширяет ResourceConfig и вызывает this.package(...) и this.register(MyFilter.class) в конструкторе

+0

Можете ли вы показать нам, как вы настраиваете/запускаете Jetty? –

+0

Да, обновленный вопрос. –

ответ

4

Проблема заключается в том, что класс, который определяет REST конечной точки не может быть реализован из-за - в моем случае - инстанцирование зависит от материала, который должен быть настроен в фильтре запроса.

Однако класс конечной точки является instanciated до вызывается фильтр. Чтобы сначала запустить фильтр, он должен быть аннотирован @PreMatching.

@Provider 
@PreMatching 
public class MyFilter implements ContainerRequestFilter { 
    ... 
} 
+0

Используете ли вы этот фильтр для пользовательских инъекций или что-то в этом роде? –

+0

Я использую его для инициализации некоторых локаторов потоков (например, счетчик, который отслеживает количество доступа к БД, вызванное запросом). –

+0

Спасибо за разъяснение. –

0

Для включения запросов кросс-происхождения в самодостаточный Jetty банку файл с услугами Джерси REST (разрешить вызовы с Swagger-UI). Создать класс CORSResponseFilter:

public class CORSResponseFilter implements ContainerResponseFilter { 

public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) 
     throws IOException { 

    MultivaluedMap headers = responseContext.getHeaders(); 

    headers.add("Access-Control-Allow-Origin", "*"); 
    //headers.add("Access-Control-Allow-Origin", "http://podcastpedia.org"); //allows CORS requests only coming from podcastpedia.org 
    headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); 
    headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia"); 
} 

}

И ссылаться на него в главном App класса:

public class App { 
public static void main(String[] args) throws Exception { 
    URI baseUri = UriBuilder.fromUri("http://localhost/").port(8080).build(); 
    ResourceConfig config = new ResourceConfig(API.class); 
    config.register(CORSResponseFilter.class); 
    Server jettyServer = JettyHttpContainerFactory.createServer(baseUri, config); 

    try { 
     jettyServer.start(); 
     jettyServer.join(); 
    } finally { 
     jettyServer.destroy(); 
    } 
} 

}

К подобным образом мы должны встроить фильтр с причалом и трикотаж. надеюсь, что это будет использовать полностью.

Смежные вопросы