2013-02-27 9 views
9

Próbuję określić filtr wstępny, który jest powiązany tylko z niektórymi wywołaniami interfejsu API, zgodnie z sugestią, którą proponuje RESTeasy documentation. Oto co mój kod wygląda następująco:Dopasowywanie filtru za pomocą konkretnej metody za pomocą funkcji NameBinding na RESTeasy

Nazwa wiązania:

@NameBinding 
public @interface ValidateFoo {} 

zasobów:

@Path("/foo/bar") 
@Produces(MediaType.APPLICATION_JSON) 
public class FooBar { 
    @GET 
    @ValidateFoo 
    public Object doStuff() { 
     //do stuff 
    } 

    @POST 
    public Object doAnotherStuff() { 
     //do another stuff 
    } 
} 

Filtr:

@ValidateFoo 
@Provider 
@PreMatching 
public class FooValidation implements ContainerRequestFilter { 
    @Override 
    public void filter(ContainerRequestContext reqContext) throws IOException { 
     //validate stuff 
    } 
} 

Problem jest: filtr FooValidation biegnie przed każdego wywołanie metody (np. Przed GET i POST do/foo/bar), nie włączone ly te opatrzone komentarzem z @ValidateFoo (wydaje mi się, że to błąd). Jeśli usuniemy adnotację @Provider z filtru, nie zostanie ona uruchomiona przed wywołaniem (zgodnie z oczekiwaniami).

Widzę to zachowanie konsekwentnie, używając WebLogic lub Tomcat. Moje zarządzanie zależnościami odbywa się za pośrednictwem Mavena, a wersja RESTeasy to 3.0-beta-3.

Ktoś doświadcza/doświadcza tego samego zachowania? Widziałem innego użytkownika z podobnym problemem na JBoss forums, bez szczęścia do tej pory.

AKTUALIZACJA: Nadal występuje ten sam problem z RESTeasy 3.0.1-Final.

Odpowiedz

7

Miałem podobny problem. Dla mnie rozwiązaniem było dodanie następującej konfiguracji adnotacji (do @ValidateFoo):

@Target({ ElementType.TYPE, ElementType.METHOD }) 
@Retention(value = RetentionPolicy.RUNTIME) 
@NameBinding 
+0

Dzięki za sugestię. Próbowałem, ale nawet po zmianie filtr wciąż jest wywoływany przed każdym pojedynczym wywołaniem mojej aplikacji, nie tylko te oznaczone adnotacją @ValidateFoo. – Viccari

+4

Ok, teraz udało nam się sprawić, żeby działało. Wygląda na to, że RESTeasy nie lubił adnotacji "@ PreMatching". Postępując zgodnie z sugestią i usuwając adnotację "@ PreMatching", wszystko działało zgodnie z oczekiwaniami. Dzięki! – Viccari

+3

To ma sens, ponieważ '@ PreMatchowanie' oznacza przed odwzorowaniem żądania na zasób RESTEasy, więc w tym momencie RESTEasy nie wie, czy istnieje jakiekolwiek powiązanie nazw. – stackoverflower

Powiązane problemy