2013-02-27 4 views
9

Sto tentando di specificare un filtro di pre-corrispondenza che è associato solo ad alcune delle mie chiamate API, seguendo ciò che suggerisce RESTeasy documentation. Ecco ciò che il mio codice è simile: vincolanteFiltro corrispondenza con metodo specifico tramite NameBinding su RESTeasy

Nome:

@NameBinding 
public @interface ValidateFoo {} 

risorse:

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

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

Filtro:

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

Il problema è: il filtro FooValidation viene eseguito prima ogni Chiamata al metodo (es .: prima di GET e POST a/foo/bar), non su quelli annotati con @ValidateFoo (sembra un bug per me). Se rimuovo l'annotazione @Provider dal filtro, non verrà eseguita prima di alcuna chiamata (come previsto).

Sto vedendo questo comportamento in modo coerente, utilizzando WebLogic o Tomcat. La mia gestione delle dipendenze viene eseguita tramite Maven e la versione RESTeasy è 3.0-beta-3.

Chiunque sperimenta/ha sperimentato lo stesso comportamento? Ho visto un altro utente con un problema simile su JBoss forums, senza fortuna finora.

AGGIORNAMENTO: Ancora riscontrato lo stesso problema con RESTeasy 3.0.1-Final.

risposta

7

Ho avuto un problema simile. Per me la soluzione era aggiungere la seguente configurazione di annotazioni (a @ValidateFoo):

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

Grazie per il suggerimento. L'ho provato, ma anche dopo la modifica, il filtro continua a essere chiamato prima di ogni singola chiamata alla mia app, non solo quelle annotate con @ValidateFoo. – Viccari

+4

Ok, ora siamo riusciti a farlo funzionare. Sembra che a RESTeasy non piaccia l'annotazione '@ PreMatching'. Seguendo il tuo suggerimento e rimuovendo l'annotazione '@ PreMatching', tutto ha funzionato come previsto. Grazie! – Viccari

+3

Ha senso, perché '@ PreMatching 'significa prima di mappare la richiesta alla risorsa RESTEasy, quindi a quel punto RESTEasy non sa se c'è una namebinding. – stackoverflower