Der Jersey 2-Filter verwendet den Containeranforderungskontext im Clientanforderungsfilter

8

Ich habe einen Jersey 2 Web Service, der nach Erhalt einer Anfrage eine andere Anfrage an einen anderen Web Service stellt, um die Antwort für die ursprüngliche Anfrage zu bilden. Also, wenn Client "A" eine Anfrage an meinen Web-Service "B" macht, macht "B" eine Anfrage an "C" als Teil der Bildung der Antwort auf "A".

A- & gt; B- & gt; C

Ich möchte einen Filter für einen Jersey 2-Webdienst implementieren, der im Wesentlichen Folgendes ausführt:

  • Client "A" sendet eine Anfrage mit einem Header wie "Mein-Header: zuerst"

  • Wenn mein Web-Service "B" dann eine Client-Anfrage "C" macht, sollte es Anhängen an diesen Header, so sendet es eine Anfrage mit diesem Header "My-Header: first, second".

Ich möchte dies als Filter implementieren, so dass nicht alle meine Ressourcen die Logik des Anhängens an den Anforderungsheader duplizieren müssen.

Aber in Jersey 2 erhalten Sie diese 4 Filter:

  • ContainerRequestFilter - Eingehende Anfragen filtern / ändern
  • ContainerResponseFilter - Filtern / Ändern von ausgehenden Antworten
  • ClientRequestFilter - Ausgehende Anforderungen filtern / ändern
  • ClientResponseFilter - Eingehende Antworten filtern / ändern

Ich muss den Header einer eingehenden Anfrage verwenden, ihn ändern und dann eine ausgehende Anfrage verwenden, also brauche ich im Wesentlichen etwas, das sowohl ein ContainerRequestFilter als auch ein ClientRequestFilter ist. Ich glaube nicht, dass das Implementieren von beiden im selben Filter funktioniert, da Sie nicht wissen, welche Client-Anforderung zu welcher Container-Anforderung gehört, oder Sie?

    
oggmonster 28.07.2014, 12:29
quelle

2 Antworten

4

Ich habe einen netten Weg gefunden, dies zu tun, der ThreadLocal nicht zur Kommunikation zwischen ContainerRequestFilter und ClientRequestFilter verwendet, da Sie nicht davon ausgehen können, dass Client-Anfragen als Antwort auf eine Container-Anfrage gestellt werden auf demselben Thread.

Dies wurde erreicht, indem eine Eigenschaft im ContainerRequestConext -Objekt in ContainerRequestFilter festgelegt wurde. Ich kann dann das Objekt ContainerRequestContext (entweder explicity oder durch Dependency Injection) in meine ClientRequestFilter übergeben. Wenn Sie die Abhängigkeitsinjektion verwenden (wenn Sie Jersey 2 verwenden, verwenden Sie wahrscheinlich HK2), können Sie all dies erreichen, ohne Ihre Ressourcenlogik zu ändern.

Habe ein ContainerRequestFilter wie folgt:

%Vor%

Und ein ClientRequestFilter , das in seinem Konstruktor ein ContainerRequestContext benötigt:

%Vor%

Dann ist es nur ein Fall, das alles zusammen zu binden. Sie benötigen eine Factory, um Client oder WebTarget zu erstellen, die Sie benötigen:

%Vor%

Dann registrieren Sie den Filter und binden Sie Ihre Fabrik an Ihre Hauptanwendung ResourceConfig :

%Vor%     
oggmonster 13.08.2014, 12:02
quelle
2

Ein Containerfilter kann sowohl ContainerRequestFilter als auch ContainerResponseFilter in einer einzigen Klasse implementieren. Dasselbe gilt für die Clientfilter.% Co_de% und ClientRequestFilter können beide in einer einzigen Filterimplementierung implementiert werden.

Aber so weit ich weiß, kann man nicht mischen. Stattdessen können Sie zwei separate Filter haben, die miteinander kommunizieren, z. mit ClientResponseFilter Muster:

%Vor%     
isnot2bad 28.07.2014 14:36
quelle