2017-11-29 8 views
0

Mit JAXRS-2.0 (Jersey 2.2, speziell) Ich versuche, einen Anfrage Interceptor auf eine bestimmte Ressource-Provider-Klasse (die in einer 3rd-Party-Bibliothek ist) anzuwenden, und ich mache es offensichtlich falsch. Ich bekomme den Fehler unten - ich bin etwas verwirrt über die Ursache. Der Nettoeffekt ist, dass der Interceptor bei jeder Anfrage an jeden Provider anstelle des 1 Providers aufgerufen wird. Dies ist der Fehler:In JAXRS wenden Sie einen Container-Anfrage Interceptor nur an einen bestimmten Provider

2017-11-26 10:43:51.061 [localhost-startStop-1][WARN][o.g.j.server.model.ResourceMethodConfig] - The given contract (interface javax.ws.rs.container.DynamicFeature) of class com.idfconnect.XYZ provider cannot be bound to a resource method.

Die Interceptor-Klasse ist definiert als:

@Provider 
public class XYZ implements WriterInterceptor, DynamicFeature { 

In meinem ResourceConfig ich die Abfangjäger für den spezifischen Anbieter Registrierung wie folgt (Ich vermute, das ist, wo ich habe Abwegen):

@ApplicationPath("service") 
public class MyApp extends ResourceConfig { 
    public MyApp() { 
    ResourceConfig rc = register(SomeThirdPartyResource.class); 
    rc.register(XYZ.class); 
    ... 

Kann mir jemand helfen, herauszufinden, wie man die Abfangjäger SomeThirdPartyResource Klasse nur zu binden?

Antwort

1

Sie sollten Ihren Provider nicht dazu bringen, DynamicFeature zu implementieren. Dies ist wahrscheinlich die Ursache der Warnung. Sie versuchen, den Interceptor zu registrieren, der auch ein DynamicFeature ist, und Jersey sagt Ihnen, dass DynamicFeature nicht etwas ist, das für eine Methode registriert werden soll.

Sie sollten eine eigene Klasse für die DynamicFeature machen und innerhalb der configure Prüfung für die Ressource, die Sie bei Ihrem Provider (mit dem ResourceInfo anhängen möchten, dann ist es dementsprechend registrieren. Zum Beispiel

class XYZ implements DynamicFeature { 
    @Override 
    public void configure(ResourceInfo info, FeatureContext ctx) { 
     if (info.getResourceClass().equals(ThirdPartyResource.class) { 
      ctx.register(YourWriterImplementation.class); 
      // or 
      ctx.register(new YourWriterImplementation()); 
     } 
    } 
} 

Der Grund, warum Sie Alle Ressourcen, die vom Interceptor abgefangen werden, sind, weil Sie den Interceptor mit dem ResourceConfig registrieren.Dies wird alle Ressourcen anhängen.Sie möchten nur die DynamicFeature registrieren und lassen Sie feststellen, welche Ressource zu binden.

+0

Das funktionierte p perfekt, danke! Ich habe das DynamicFeature in eine separate Klasse vom Interceptor Provider aufgeteilt und jetzt ist alles in Ordnung –

Verwandte Themen