2013-07-04 9 views
7

私はRESTクラスでjavax.ws.rs.Pathクラスを使用してパスを設定しています。これは奇妙な動作です...私の設定はこれのようなものです...これは実際のファイルではありませんが、自分の設定を理解するための複製を示しています。クラスレベルとメソッドレベルの@Path設定

Class1の

@Path("/v2") 
public class BoxResource {   
    @POST 
    @Path("/ie/box") 
    public Response createbox(...) { 
    ... 
    } 
} 

クラス2

@Path("/v2/ie") 
public class BagResource {   
    @POST 
    @Path("/bag") 
    public Response createbag(...) { 
     ... 
    }   
} 

私は/v2/ie/boxのようなHTTPリクエストを作成する場合は、サーバーの構成エラーがスローされます。しかし、Class2を以下のように変更しても問題ありません。

@Path("/v2/ie/bag") 
public class BagResource {    
    @POST 
    public Response createbag(...) { 

    } 
} 

なぜそうですか?クラスレベルとメソッドレベルで@pathの設定が異なりますか?

答えて

13

ISクラス注釈として

@Path("/v2/ie") 

を有するので/v2/ie/box要求がClass2にマッピングされます。

この場合、最長のPathが勝ちます。 Class1は、より短いクラスの注釈@Path("/v2")を持っているため、決して見られません。

Class2には、残りの/boxにマッピングする方法がないため、404 Not Foundが表示されます。

勧告

  1. 使用@Path注釈方法でのみ@Path("/v2/ie/bag")@Path("/v2/ie/box")OR
  2. 使用@Path("/bag")@Path("/v2/ie")及び方法のアノテーションのクラス注釈付き1つのリソースクラスと@Path("/box")

編集

the JAX-RS 2.0 specのセクション "リソースメソッドに3.7マッチングの要求" を参照してください。

+0

私はクラスレベルのパス( "/ v2")を両方のクラスに作成した後でも、同じエラーが返されます –

+0

私の答えにリンクしている仕様をお読みください。あなたの* real *コードをあなたの質問に追加してください。 –

+0

私は仕様を理解できません...そして、パスが/ v2/ow/..のような私のボックスクラスには他のメソッドもありますので、一つのリソースを作ることはできません..本当にコードを追加することもできます。 –

関連する問題