2017-01-17 4 views
1

У меня проблема с Tomey Plume 7.0.2.JAX-RS - Создание фильтра, расширяющего ContainerRequestFilter

Я создал фильтр, который так:

package com.gfp.rest.providers; 

import java.io.IOException; 

import javax.annotation.Priority; 
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.container.PreMatching; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.ResponseBuilder; 
import javax.ws.rs.core.Response.Status; 
import javax.ws.rs.ext.Provider; 

@PreMatching 
@Provider 
@Priority(value = 1) 
public class AuthenticationFilter implements ContainerRequestFilter 
{ 
    public AuthenticationFilter() 
    { 
     System.out.println("AuthenticationFilter.AuthenticationFilter()"); 
    } 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException 
    { 
     System.out.println("AuthenticationFilter.filter()"); 
     String token = requestContext.getHeaderString("token"); 

     ResponseBuilder responseBuilder = null; 
     Response response = null; 

     // check if token is empty 
     if (token.isEmpty()) { 
      responseBuilder = Response.serverError(); 
      response = responseBuilder.status(Status.UNAUTHORIZED).build(); 
      requestContext.abortWith(response); 
     } 
    } 
} 

Вот моя Rest Применение:

package com.gfp.rest; 

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 

@ApplicationPath("api/v1") 
public class RestApplication extends Application 
{ 
} 

Проблема: Фильтр, кажется, не дозвонились. Я прочитал много документации и много других сообщений, я не могу найти какое-либо решение. Есть что-то особенное, что я пропустил?

Большое спасибо!

ответ

0

Попробуйте

package com.gfp.rest; 

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 

@ApplicationPath("api/v1") 
public class RestApplication extends Application 
{ 
public Set<Class<?>> getClasses() { 
     return getRestClasses(); 
    } 

    private Set<Class<?>> getRestClasses() { 
     Set<Class<?>> resources = new java.util.HashSet<Class<?>>();   
     resources.add(AuthenticationFilter.class); 
     return resources;  
    } 
} 

Также вам может понадобиться использовать org.glassfish.jersey.servlet.ServletContainer в качестве контейнера сервлетов в web.xml для Джерси 2.x.

+0

Если вы сделаете это, вам также необходимо будет зарегистрировать все классы ресурсов. Пустой класс приложения _supposed_ работает, поскольку он указан для запуска сканирования пути к классам классов «@ Путь» и «@ Поставщик». Когда вы добавляете класс, вы отключите сканирование классов и должны сами регистрировать все. –

+0

Получил NullPointerException, как показано ниже. Есть ли «автоматический способ», чтобы заставить его работать с TomEE? –

0

зависит конфигурации (OpenEJB-jar.xml и системные свойства, я думаю), так как он должен работать из коробки (https://github.com/apache/tomee/blob/41cb392c6e3dc63d6792eae88e90c33743255212/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CDIProviderContainerRequestFilterTest.java не делает ничего больше)

Альтернатива заключается в регистрации фильтра в классах, как и в Рахул-х ответьте (но, пожалуйста, не делайте ничего, что связано с Джерси, поскольку TomEE не использует трикотаж, это не сработает и просто добавит беспорядок) или просто настройте его в openejb-jar.xml.

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