2016-09-22 9 views
2

私たちはResteasy 3.0.9をJAX-RS Webサービス用に使用していましたが、最近3.013に切り替わりました。ここで多くのRESTEASY002142: Multiple resource methods match request警告が表示され始めました。JAX-RSメソッドのパラメータの型を見直すことはできますか?

例えば、我々のような方法があります:

@Path("/{id}") 
public String getSome(UUID id) 

@Path("/{id}") 
public String getSome(int id) 

を私は(RESTEasyには、すべての候補の中から最初の方法を選択しているようだとして、おそらく、私たちは非常に幸運だった、それは3.0.9で働いていたかどうかはわかりません3.0.19種類の候補メソッド)。

一つの解決策は、明示的に正規表現を指定することです:@Path("/{id : [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}")

しかし、どういうわけか、メソッドのパラメータを調べて自動的に適切な正規表現を構築するためのRESTEasyを指示する方法はありますか?

答えて

2

私が知る限り、RESTEasyはリクエストを照合する際にメソッドのパラメータタイプを考慮しません。 (RESTEasyには、実装する)JSR-339によれば、これは要求マッチング処理の仕組みである。

要求が正規 リクエストURIを比較することにより、対応するリソースの方法又はサブリソース方法のメディアタイプに一致しています任意の要求エンティティ、および要求されたレスポンス エンティティ形式を、リソースクラスおよびそのメソッドのメタデータアノテーションに追加します。一致するリソース メソッドまたはサブリソースメソッドが見つからない場合は、適切なエラー応答が返されます。 [...]

JAX-RSの実装では、要求されたURIと@Pathの注釈値が一致する必要があります。 @Path注釈値では、中括弧({および})で示される変数を定義できます。

正規表現が指定されていない場合、JAX-RSの実装では、URIテンプレート変数のそれぞれが正規表現または([ˆ/]+?)に置き換えられます。

あなたはあなたの質問で述べたような状況に対処するために、あなたは一つの資源法にUUIDを一致させるために正規表現を指定する必要があります。

@Path("{id : [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}") 

そして、あなたはまた、他のリソースの方法で整数にマッチする正規表現を検討することがあります。

@Path("{id : \\d+}") 
+0

回答ありがとうございます。しかし、質問には完全には答えません。 JAX-RS 2.0仕様では、要求一致のステップ2でパラメータ型を調べる実装を禁止していません。 Cの各クラスZについて、各サブリソースメソッドとロケータの正規表現をEに追加します。 i。各サブリソースメソッドDについて、R(TD)を追加する。ここで、TDはサブリソースメソッドのURIパステンプレートである。 Resteasyは既に '' '/ things/{id}' ''のようなテンプレートを正規表現に変換します。したがって、型に基づく正規表現の可能性があります。 – relgames

+0

JAX-RS 2.0仕様では、「少なくとも、それはしないでください」という部分は正しくありません。私が間違っている場合は、仕様書で禁止されている正確な場所を指摘してください。 – relgames

+0

@relgames JAX-RS 2。仕様書に記述されているようにアルゴリズムを使用する必要はないが、仕様書に記述されているアルゴリズムで生成されたものと同等の結果を生成しなければならないと述べている。 JAX-RS 2.0仕様では、メソッドの型パラメータを調べる実装を禁止していません。私が知る限り、RESTEasyは実装していません。 –

関連する問題