2012-02-21 18 views
3

私は現在Jerseyを使用しているRESTfulなAPIを持っており、それをOData標準に準拠するように変換しています。私はまだ変換していないものがいくつかありますが、そこに着くので、この時点では重要ではありません。私が変換する必要があることの1つが重要です、キーパスparamsです。小田田は、かっこで囲まれたキーを作る標準を持っています。この例では、myapi.com/product(1) - idが1の製品を取得するためのOData呼び出しです。現在、このmyapi.com/product/1を使用しているシステムで可能です。ジャージーとオダータキーパスパラメーター形式

pathパラメータの括弧に404エラーが表示されます。私のクラスレベルのパスは@Path( "/ product")で、メソッドレベルのパスは@Path( "({id})")で、@Path( "/ {id}")を使用します。私は、メソッドでそれらを取り除くために変数計画の一部としてかっこを追加しようとしましたが、いくつかの正規表現@Path( "{id:regex stuff}")でidをフォーマットしようとしましたが、いずれも動作しません。

@Path "/({id})"のようなメソッドパスパラメータを作成すると、呼び出しがmyapi.com/product/(1)になるので、正常に動作します。かっこは明らかに問題ではありません。ジャージーは、ルーティングのためにフォワードスラッシュを使用して塊にウリを分割し、IDとルートリソース名の間にスラッシュがないことを検出すると、何も見つかりません。それは理にかなっている。

URI文字列を正規表現などと照合する方法を変更する方法はありますか?誰もジャージーを小田と一緒に使ったことはありますか?むしろodata4jをこの問題の解決に使うのではなく、これを動作させる方法があるはずです。

私が何をしたか

:パベルBucekの答えに基づいて 私はセキュリティのために使用するフィルターに独立ContainrRequestFilterを実装しました。私の場合は、存在しているかどうかを見ていませんでしたが、取り替えをやろうとしました。

try 
{ 
    String uriString = request.getRequestUri().toString(); 
    uriString = uriString.replaceAll("(\(|\)\/?)", "/"); 
    request.setUris(request.getBaseUri(), new URI(uriString)); 
} catch (final Exception e) 
{ 
} 
return request; 

答えて

1

私は、着信URIの「/ $」と、この「プロトコル」置き換えることになる、ContainerRequestFilterを導入することになる「()$」を処理する方法が最も簡単な方法だと思います。したがって、1つのアプリケーションでODataと標準のRESTリクエストを処理できます。

http://jersey.java.net/nonav/apidocs/1.11/jersey/com/sun/jersey/spi/container/ContainerRequestFilter.html

シンプルなフィルタが、私はこのケースをテストするために使用を参照してください:

rc.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, new ContainerRequestFilter() { 
     @Override 
     public ContainerRequest filter(ContainerRequest request) { 
      try { 

       if(request.getRequestUri().toString().endsWith("(1)")) { 
        request.setUris(
          request.getBaseUri(), 
          new URI(request.getRequestUri().toString().replace("(1)", "/1"))); 
       } 

      } catch (Exception e) { 
      } 

      return request; 
     } 
    }); 

を両方
カールは "http:// localhostを:9998/helloworldの(1)"
カール「のhttp: // localhost:9998/helloworld/1 "
ここで同じリソースメソッドをヒットしました。 (明らかに、さまざまな値を扱えるようにするために現在のフィルタを改善する必要がありますが、それはあなたにとっては効果的です)。

+0

すでにフィルタが用意されていますので、これを追加して試してみてください。ジャージーがフィルターに当たる前に道(資源)を決めたと思ったので、私はそれを考慮しなかった。 – Elrond