2012-11-29 7 views
8

Ich habe einen Jax-Rs-Dienst, der eine Reihe von Parametern im Pfad, pathparameters erhält. Diese Parameter können Strings Werte nicht geeignet für Urls enthalten, so dass sie auf der Client-Seite Urlencoded die java.net.UrlEncoder mit etwa so:Jax-rs automatische Dekodierung Pfadparam

String param = URLEncoder.encode(o.toString(), "UTF-8"); 

Hier wird die URL supplier/group/param1/param2/param3 zu bauen. Wenn einer von diesen aufgrund der Urlencodierung geändert wird, beispielsweise wenn es nur ein Leerzeichen ist, ist die auf dem Dienst empfangene Zeichenfolge ein +-Zeichen.

Ich würde erwarten, Jaxrs automatisch codierte Pfadparameter dekodieren.

EDIT: Testen ein bisschen mehr Ich entdeckte, dass beim Senden mit für den Raum ist es in der Lage, den Parameter zu dekodieren.

+0

Die Verwendung von 'URI.toAsciiString' funktioniert nicht immer. Die Antwort von @ yegor256 ist robuster - füge die '@ Encoded'-Annotation über der Funktion decaration – SomethingSomething

Antwort

11

Die automatische Codierung von pathparams funktioniert wie erwartet. Das Problem war, dass verwendet wird, um Leerzeichen in der URL selbst zu codieren, während + zum Codieren der Abfragezeichenfolge verwendet wird (der Teil nach dem?). Pathparams sind wirklich Teile der URL, also sollte% 20 verwendet werden.

Mit URI.toAsciiString() anstelle von UrlEncoder.encode(...) und Übergabe der verschiedenen Teile gibt eine gültige URL, die korrekt dekodiert wird.

3

Zitat von PathParam javadoc:

Der Wert URL decodiert, sofern dies nicht das kodierte Anmerkung deaktiviert werden.

+2

genau hinzu! Aber das passiert nicht, und ich habe es nicht deaktiviert! –

+0

Welche JAX-RS-Implementierung verwenden Sie? – yegor256

+0

Dies ist ein Problem mit Tests, die einen eingebetteten Openejb-Container ausführen. Wir werden dies jedoch auf einem Websphere-Server bereitstellen ... ist das eine CXF-Implementierung? –