2012-11-29 8 views
8

私はpathパラメータのセットをパスパラメータで受け取るjax-rsサービスを持っています。これらのパラメータは、URLのない適切な値を含む文字列であってもよいし、そう、彼らはそうのようなjava.net.UrlEncoderを使用してクライアント側でURLエンコードされています。これは、URL supplier/group/param1/param2/param3を構築するために使用されJax-rs自動デコードパスパラム

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

。これらのうちの1つがurlencodingのために変更された場合、たとえばスペースだけの場合は、サービスで受信された文字列は+です。

@GET 
@Path("{supplierId}/{groupCode}/{groupId}") 
@Produces({MediaType.APPLICATION_XML, MediaType.TEXT_XML}) 
public SupplierGroup getSupplierGroup(@PathParam("supplierId") BigDecimal supplierId, 
     @PathParam("groupCode") String groupCode, 
     @PathParam("groupId") BigDecimal groupId) { 
    //now groupCode is "+", not " " 
} 

私はjaxrsが自動的にエンコードされたパスのparamsをデコードすることを期待します。

EDIT: もう少しテストしたところ、スペースに%20を使用して送信すると、パラメータをデコードできることがわかりました。 PathParamのjavadocから

+0

'URI.toAsciiString'の使用は必ずしも機能しません。 @ yegor256の答えはより堅牢です。関数デコンベーションの上に '@ Encoded'アノテーションを追加してください。 – SomethingSomething

答えて

11

pathparamsの自動エンコードは、期待通りに機能します。問題は、がクエリ文字列(?の後の部分)をエンコードするために使用されているのに対し、%20はURL自体のスペースをエンコードするために使用されていたということでした。 Pathparamsは実際にはURLの一部なので、%20を使用する必要があります。

UrlEncoder.encode(...)の代わりにURI.toAsciiString()を使用し、異なる部分を渡すと、正しく復号化された有効なURLが得られます。

3

引用:

値はURLで、これはエンコードされた注釈を使用して無効にされていない限り、デコード。

+2

!しかし、これは起こらない、私はそれを無効にしていない! –

+0

どのJAX-RS実装を使用していますか? – yegor256

+0

これは、埋め込まれたopenejbコンテナを実行しているテストでの問題です。私たちはこれをWebsphereサーバーにデプロイしようとしています...それはcxfの実装ですか? –

関連する問題