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:
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?
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:
Und ein ClientRequestFilter
, das in seinem Konstruktor ein ContainerRequestContext
benötigt:
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:
Dann registrieren Sie den Filter und binden Sie Ihre Fabrik an Ihre Hauptanwendung ResourceConfig
:
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:
Tags und Links java jersey web-services jersey-2.0 jersey-client