2014-05-13 19 views
16

Sto tentando di eseguire alcune convalida sulle richieste che entrano nel mio servizio utilizzando lo ContainerRequestFilter. Funziona tutto bene, tuttavia c'è un problema: ogni singola richiesta passa attraverso i filtri, anche se alcuni filtri non verranno mai applicati (un solo filtro si convalida su ResourceOne, un altro solo su ResourceTwo ecc.)Filtro richiesta jersey solo su alcuni URI

C'è un modo per impostare un filtro solo per essere invocato su una richiesta in determinate condizioni?

Anche se non è un bloccante o un ostacolo, sarebbe bello essere in grado di fermare questo tipo di comportamento :)

risposta

37

Presumo che si sta utilizzando Jersey 2.x (implementazione per JAX-RS 2.0 API).

Hai due modi per raggiungere il tuo obiettivo.

1. Usa nome binding:


1,1 crea annotazione personalizzati annotato con @NameBinding:

@NameBinding 
@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface AnnotationForResourceOne {} 

1,2. Crea filtro con la tua annotazione:

@Provider 
@PreMatching 
@AnnotationForResourceOne 
public class ResourceOneFilter implements ContainerRequestFilter { 
... 
} 

1.3. E si legano filtro realizzato con metodo risorsa selezionata:

@Path("/resources") 
public class Resources { 
    @GET 
    @Path("/resourceOne") 
    @AnnotationForResourceOne 
    public String getResourceOne() {...} 
} 

2. Uso DynamicFeature:


2,1. Crea filtro:

public class ResourceOneFilter implements ContainerRequestFilter { 
... 
} 

2.2. Implementare l'interfaccia javax.ws.rs.container.DynamicFeature:

@Provider 
public class MaxAgeFeature implements DynamicFeature { 
    public void configure(ResourceInfo ri, FeatureContext ctx) { 
     if(resourceShouldBeFiltered(ri)){ 
      ResourceOneFilter filter = new ResourceOneFilter(); 
      ctx.register(filter); 
     } 
    } 
} 

In questo scenario:

  • filtro non viene annotato con @Provider annotazioni;
  • configure(...) metodo invocato per ogni metodo di risorsa;
  • ctx.register(filter) associa il filtro con il metodo di risorsa;
+0

DynamicFeature ha funzionato come un fascino. –

+5

Sei sicuro che l'annotazione di '@ PreMatching' è necessaria nell'esempio NameBinding? – Zakhar

+0

Nome binding non ha funzionato per me – Kunal

7

Quando si utilizza @NameBinding, è necessario rimuovere l'annotazione @PreMatching dal filtro. @PreMatching fa passare tutte le richieste attraverso il filtro.

1

@PreMatching non funziona insieme a @NameBinding, perché la classe/metodo di risorsa non è ancora nota nella fase di pre-abbinamento. Ho risolto questo problema rimuovendo @PreMatching dal filtro e utilizzando la priorità di associazione. Vedi ResourceConfig.register(Object component, int bindingPriority).

I filtri devono essere eseguiti prima che la risorsa ottenga semplicemente una priorità più alta.

Problemi correlati