Совместимость ContainerResponseFilter в джерси 1.17
Могу ли я запустить свой CustomFilter расширенный с ContainerResponseFilter в Джерси1.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[]{"/"});
...
.....
2 ответа
Добавьте свойство ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS как init-param
а не как context-param
:
...
adapter3.addInitParameter(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, PoweredbyResponseFilter.class.getName());
...
РЕДАКТИРОВАТЬ 1
Из вашего ответа кажется, что вы на самом деле пытаетесь использовать среду выполнения Jersey 1.x (1.17) с реализованными провайдерами JAX-RS 2.0 (ContainerRequestContext
а также ContainerResponseContext
были представлены в JAX-RS 2.0, и Jersey 1.x не знает, как их использовать).
Поэтому мой совет: удалите все зависимости от Jersey 1.17 и замените их зависимостями Jersey 2.x. Взгляните на наш пример helloworld-webapp (особенно в классе App), чтобы узнать, как создать экземпляр сервера Grizzly с приложением JAX-RS.
Обратите внимание, что достаточно добавить только свойство ServerProperties.PROVIDER_PACKAGES в init-param
s, а также ваши ресурсы и поставщики (включая фильтры ответов) будут отсканированы и зарегистрированы в приложении.
МОЙ Фильтр:
@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