Совместимость ContainerResponseFilter в джерси 1.17

Могу ли я запустить свой CustomFilter, расширенный с помощью ContainerResponseFilter, в jersey1.17. Я использую GrizzlyWebServer. Пожалуйста, предложите. Ниже приведен мой пример кода сервера для добавления фильтра.

   GrizzlyWebServer webServer = new GrizzlyWebServer(.............);
    ....
    ....

    ServletAdapter adapter3 = new ServletAdapter();
    adapter3.addInitParameter("com.sun.jersey.config.property.packages", "com.motilink.server.services");
    adapter3.setContextPath("/");
    adapter3.setServletInstance(new ServletContainer());
    adapter3.addContextParameter(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, PoweredbyResponseFilter.class.getName());
    webServer.addGrizzlyAdapter(adapter3, new String[]{"/"});

   ...
   .....

person Led Zeppelin    schedule 05.08.2013    source источник


Ответы (2)


МОЙ фильтр:

 @FrontierResponse
 @Provider
 public class PoweredbyResponseFilter implements ContainerResponseFilter {

@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
        throws IOException {
    System.out.println("hell");
    responseContext.getHeaders().add("X-Powered-By", "Jersey :-)");

}

}

Класс ресурса:

@NameBinding
@Retention(value = RetentionPolicy.RUNTIME)
public @interface FrontierResponse {
}

@GET
@Produces("text/plain")
@Path("plain")
//@FrontierResponse
public String getMessage() {
    System.out.println("hello world called");
    return "Hello World";
}

и, наконец, я вызываю его из браузера http://localhost:4464/plain

person Led Zeppelin    schedule 05.08.2013
comment
Вы используете Джерси 1? Я застрял в аналогичной проблеме. Не могли бы вы взглянуть? stackoverflow.com/questions/39283593 / - person Kuldeep Yadav; 02.09.2016

Добавьте ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS свойство как init-param, а не как context-param:

...
adapter3.addInitParameter(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, PoweredbyResponseFilter.class.getName());
...

РЕДАКТИРОВАТЬ 1

Из вашего ответа кажется, что вы на самом деле пытаетесь использовать среду выполнения Джерси 1.x (1.17) с реализованными поставщиками JAX-RS 2.0 (ContainerRequestContext и ContainerResponseContext были введены в JAX-RS 2.0, а Джерси 1.x не знает, как использовать их).

Поэтому мой совет: отбросьте все свои зависимости от Джерси 1.17 и замените их зависимостями от Джерси 2.x. Взгляните на наш пример helloworld-webapp (особенно в App), чтобы узнать, как создать экземпляр сервера Grizzly с приложением JAX-RS.

Обратите внимание, что достаточно добавить только ServerProperties. .PROVIDER_PACKAGES на init-params, а ваши Ресурсы и Поставщики (включая фильтры ответов) будут просканированы и зарегистрированы в приложении.

person Michal Gajdos    schedule 05.08.2013
comment
можешь пожалуйста объяснить мне!! - person Led Zeppelin; 05.08.2013
comment
Ваши ресурсы JAX-RS в пакете com.motilink.server.services работают должным образом? Вы видите что-то в журнале сервера? - person Michal Gajdos; 05.08.2013
comment
нет, в журнале сервера есть только полученные данные!! никаких сообщений об ошибках, просто фильтр не выполняется. Это связано с использованием джерси v1.17 и javax.ws.rs-api.2.0? - person Led Zeppelin; 05.08.2013
comment
Ну, вы, конечно, не должны смешивать эти два. Используйте Jersey 1.x с API JAX-RS 1.1 или Jersey 2.x с API JAX-RS 2.0. Можете ли вы показать нам свой фильтр, ресурс JAX-RS и как вы называете свою службу? - person Michal Gajdos; 05.08.2013
comment
См. EDIT 1 в моем ответе. - person Michal Gajdos; 06.08.2013