Nicht mehr überschreiben einen Antwort-header mit einem Jersey-client-filter

Ich versuche, mit der Jersey-client-API zu konsumieren ein Drittel-party-REST-Dienst. Ich Plane, verwenden Sie das automatische POJO deserialisation gehen von JSON-Antworten zu Java-Objekten.

Leider, die Dritte party-service liefert die Antworten, die mit dem Inhaltstyp "text/javascript". Meine Jersey-client, nicht zu verstehen, dies sollte berücksichtigt werden als JSON-Objekt und nicht zu deserialise das Objekt.

Schrieb ich ein einfaches Jersey-server-Anwendung, um zu überprüfen, dass durch eine änderung des content type von "text/javascript" zu "application/json" dass die deserialisation funktioniert.

Bewaffnet mit diesen Informationen, ich über die Verwendung einer Jersey-client-filter zum ändern der Antwort-Header. Der code stammt aus einer Bemerkung des Autors der diese Frage. In der Tat, die Frage wird sein, genau die gleiche wie meine - aber die Beantworter mis-beantwortet die Frage und zeigt, wie Sie die Anfrage Header (anstatt der Antwort - Header). Der ursprüngliche Autor war in der Lage zu verwenden, die Antwort auf seine Lösung, aber, scheint es, dass seine angegebenen Lösung nicht funktioniert.

Den filter-code:

client.addFilter(new ClientFilter() {
  @Override public ClientResponse handle(ClientRequest cr) 
      throws ClientHandlerException {
    ClientResponse response = getNext().handle(cr); 
    response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); 
    return response;
  }
});

Ausgeführt, wenn jedoch ein UnsupportedOperationException ausgelöst:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.clear(Collections.java:1035)
at com.sun.jersey.core.util.StringKeyIgnoreCaseMultivaluedMap.putSingle(StringKeyIgnoreCaseMultivaluedMap.java:78)
at com.sun.jersey.core.util.StringKeyIgnoreCaseMultivaluedMap.putSingle(StringKeyIgnoreCaseMultivaluedMap.java:56)
at App$1.handle(App.java:49)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:507)
at App.main(App.java:63)

Den zurückgegebenen Header angezeigt werden, eingewickelt in eine unmodifiable collection.

Dann versuchte ich zu kopieren Sie alle überschriften auf eine neue Kollektion, aber es gibt keine Möglichkeit, dass ich sehen kann, um set eine Karte der Header in die Antwort.

Endlich, dachte ich, vielleicht kann ich eine neue erstellen ClientResponse mit meinem geänderten Header. Allerdings wird der Konstruktor ClientResponse hat diese Signatur:

public ClientResponse(int status, 
                      InBoundHeaders headers, 
                      InputStream entity, 
                      MessageBodyWorkers workers)  

Es ist trivial zu kopieren status, headers und entity Variablen aus dem original. Aber ich sehe keinen Weg, um einen Verweis auf die workers Feld.

Wie kann ich einen Jersey-client-filter zum ändern der Antwort-header aus "text/javascript" zu "application/json" so, dass mein POJO deserialisation funktionieren???

InformationsquelleAutor Greg Kopff | 2012-10-05
Schreibe einen Kommentar