Ich gehe davon aus, dass Sie verwenden Jersey 2.x (Implementierung für JAX-RS 2.0 API).
Sie haben zwei Möglichkeiten, Ihr Ziel zu erreichen.
1. Name verwenden Bindungen:
1,1 benutzerdefinierte Anmerkung mit @NameBinding kommentierten erstellen:
@NameBinding
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationForResourceOne {}
1,2. Erstellen Sie einen Filter mit Ihrer Anmerkung:
@Provider
@PreMatching
@AnnotationForResourceOne
public class ResourceOneFilter implements ContainerRequestFilter {
...
}
1.3. Und BIND erstellt Filter mit ausgewählten Ressourcen Methode:
@Path("/resources")
public class Resources {
@GET
@Path("/resourceOne")
@AnnotationForResourceOne
public String getResourceOne() {...}
}
2. Verwenden DynamicFeature:
2,1. Filter erstellen:
public class ResourceOneFilter implements ContainerRequestFilter {
...
}
2.2. Implementieren javax.ws.rs.container.DynamicFeature Schnittstelle:
@Provider
public class MaxAgeFeature implements DynamicFeature {
public void configure(ResourceInfo ri, FeatureContext ctx) {
if(resourceShouldBeFiltered(ri)){
ResourceOneFilter filter = new ResourceOneFilter();
ctx.register(filter);
}
}
}
In diesem Szenario:
- Filter nicht mit
@Provider
Anmerkung kommentiert;
configure(...)
Methode wird für jede Ressourcenmethode aufgerufen;
ctx.register(filter)
bindet Filter mit Ressourcenmethode;
Das DynamicFeature funktionierte wie ein Charme. –
Sind Sie sicher, dass die Annotation "@ PreMatching" im Beispiel "NameBinding" benötigt wird? – Zakhar
Namensbindungen funktionierten nicht für mich – Kunal