Джерси ContainerRequestFilter не срабатывает

Я'м пытаюсь использовать `ContainerRequestFilter осуществить некоторые проверки подлинности на кота приложение-Джерси. Я последовал за этого документа. Проблема : фильтр не срабатывает

Класс фильтра :

@Provider
public class AuthFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext)
        throws IOException {

        // MY AUTHENTICATION CODE GOES HERE

    }

Файл web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="debate-rest"
    version="3.0">
  <display-name>rest</display-name>
   <servlet>  
    <servlet-name>Jersey REST Service</servlet-name>  
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>  
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.hck.debate.rest.security.AuthFilter</param-value>
    </init-param>
    <init-param>  
      <param-name>jersey.config.server.provider.packages</param-name>  
      <param-value>com.hck.debate.rest.controller</param-value>  
    </init-param>  
    <init-param>  
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>  
        <param-value>true</param-value>  
    </init-param>      
    <load-on-startup>1</load-on-startup>  
  </servlet>  
  <servlet-mapping>  
    <servlet-name>Jersey REST Service</servlet-name>  
    <url-pattern>/*</url-pattern>  
  </servlet-mapping>
Решение

Ладно, я не'т получить, что `Джерси.конфиг.сервер.поставщика.пакеты параметра инициализации должен ссылаться не только классы сервиса (конечные точки API), но и все классы, включая фильтры.

Теперь он работает :


jersey.config.server.provider.packages  
  <param-value>com.hck.debate.rest.controller;com.hck.debate.rest.security
com.hck.debate.rest.security.AuthFilter
Комментарии (5)

Мне также пришлось добавить @провайдер JAX-РТС примечания к мои фильтры. Это делает фильтр обнаружить в JAX-РТС фазы сканирования.

@Provider
public class MyAppFilter implements ContainerRequestFilter {
    // filter logic
}
Комментарии (3)

Некоторые советы:

  1. Убедитесь, что вы're, используя JAX-РТС версии 2.17.
  2. Убедитесь, что вы're, используя право импорта в фильтре:
  • импорт пакета javax.с WS.РС.контейнер.ContainerRequestContext;`
  • импорт пакета javax.с WS.РС.контейнер.ContainerRequestFilter;`
  1. Добавить `@ "поставщика" аннотация
Комментарии (2)

Нам не хватает ниже позвонить в наш класс реализации resourceconfig по:

register(CorrelationIdFilter.class);
Комментарии (0)

Минимальные требования для работы фильтров с Джерси:

  • добавить аннотацию @поставщику фильтр класса
  • пространство имен класс фильтра должен быть включен в 'Джерси.конфиг.сервер.поставщика.пакеты' первонач-парам

Любые другие параметры, разве'т необходимости (например, 'сом.солнце.Джерси.Сио.контейнер.ContainerRequestFilters' инит-param или resourceconfig по)

Комментарии (2)

У меня была такая же проблема JAX-РТС 2 , Джерси и ниже аннотации исправил

 @PreMatching
Комментарии (1)

Вместо javax.с WS.РС, я использовал com.солнце.Джерси и он работал

импортировать com.солнце.Джерси.Сио.контейнер.ContainerRequestFilter импортировать com.солнце.Джерси.Сио.контейнер.ContainerRequest

Пользователи Dropwizard нужно для этого

environment.jersey().getResourceConfig()
           .getContainerRequestFilters()
           .add(filter);
Комментарии (1)

Если вы застряли, как я, обратите внимание, что TomEE 1.7.X использует JAX-РТС 1.1, которая не включает ContainerRequestFilter.

Комментарии (0)

Для всех, кто с этой проблемой в мул ЭСБ. Не забудьте зарегистрировать путь с:






Комментарии (0)

Вместо того, чтобы использовать @поставщиком аннотации (которая не работает в моем случае), вы можете зарегистрировать свойContainerRequestFilter вручную с JerseyServletFactory`:

JerseyServletFactory jerseyServletFactory = new JerseyServletFactory(config);
HttpServlet myServiceServlet = jerseyServletFactory.create(myResource);

// Register your ContainerRequestFilter like this
jerseyServletFactory.addRequestFilter(new MyFilter());

httpServer.register(myServiceServlet, "/api");
httpServer.start();
Комментарии (3)