Jersey 2-filter verwendet Container Anfrage-Kontext im Client-Request-Filter
Habe ich einen Jersey 2 Web-Service, der beim Empfang einer Anforderung, macht eine Anfrage an einen anderen web-service, um die Antwort auf die ursprüngliche Anfrage. Also, wenn "A" - client stellt eine Anfrage auf meiner web-service "B", "B" stellt eine Anfrage zum "C" als Teil der Bildung der Reaktion auf "A".
Ein->B->C
Möchte ich einen filter implementieren, der ein Trikot 2 web-service, im wesentlichen:
-
"A" - Client sendet eine Anforderung mit einem header wie
"Mein-Header:die erste -
Wenn meine web-service "B", dann macht eine client-Anforderung "C", es sollte
"anfügen", um die Kopfzeile, so sendet er eine Anfrage mit diesem header
"Mein-Header:erste,zweite".
Ich implementieren möchten, dieses als ein filter also, an alle meine Ressourcen nicht haben, um die doppelte Logik von Anhängen zu den request-header.
Jedoch in Jersey 2, diese bekommen Sie 4 Filter:
- ContainerRequestFilter - Filter/ändern Sie eingehende Anfragen
- ContainerResponseFilter - Filter/ändern ausgehende Antworten
- ClientRequestFilter - Filter/ändern Sie ausgehende Anfragen
- ClientResponseFilter - Filter/ändern Sie eingehende Antworten
Ich den header einer eingehenden ersuchen, ihn zu verändern, dann verwenden Sie eine ausgehende Anfrage, also im Grunde genommen brauche ich etwas, das sowohl eine ContainerRequestFilter und ein ClientRequestFilter. Ich glaube nicht, dass die Umsetzung beide in den gleichen filter arbeiten, da Sie nicht wissen, welche Client-Wunsch-Karten, auf die Container-Anfrage, oder?
- Was meinst du mit "wenn Sie meine web-service macht dann eine client-Anfrage"? In der Regel wird ein web-service erstellt eine Antwort aufgrund einer client-Anfrage.
- Gemacht die Frage ein bisschen klarer jetzt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich einen schönen Weg, dies zu tun, in dem nicht
ThreadLocal
für die Kommunikation zwischen denContainerRequestFilter
und dieClientRequestFilter
, wie Sie können nicht davon ausgehen, dass die client-Anfragen in Reaktion auf ein container-Anfrage wird auf dem gleichen thread.Dem Weg, den ich erreicht wird dies durch das festlegen einer Eigenschaft in der
ContainerRequestConext
Objekt in derContainerRequestFilter
. Ich kann dann passieren dieContainerRequestContext
Objekt (entweder ausdrücklich oder durch dependency injection) in meinenClientRequestFilter
. Wenn Sie mit dependency injection (wenn Sie mit Jersey 2 dann verwenden Sie wahrscheinlich HK2), dann kann dies erreicht werden, ohne änderungen an Ihrer Ressource-Ebene Logik.Haben eine
ContainerRequestFilter
wie diese:Und ein
ClientRequestFilter
nimmtContainerRequestContext
in seinem Konstruktor:Dann ist es nur ein Fall von binden alle zusammen. Sie benötigen ein Werk zu erstellen
Client
oderWebTarget
, die Sie benötigen:Dann registrieren Sie die filter und binden Sie Ihr Werk auf Ihrer Haupt-Anwendung
ResourceConfig
:ContainerRequestFilter
Sie können entfernen Sie es vollständig, da von der injiziertenContainerRequestContext
können Sie den original-Antrag (einschließlich Kopfzeilen, etc.). Ich bin mit diesem trick zu implementieren Sie einen client, der automatisch durchläuft-Header aus der Anfrage zu neue HTTP-Aufrufe.Einen container filter implementieren können, die sowohl
ContainerRequestFilter
undContainerResponseFilter
in einer einzigen Klasse. Das gleiche gilt für den client-Filter,ClientRequestFilter
undClientResponseFilter
beide können implementiert werden in einem einzigen filter-Implementierung.Aber kann man nicht mischen soweit ich weiß. Stattdessen können Sie zwei separate Filter, die miteinander kommunizieren, z.B. mit
ThreadLocal
Muster: