2011-09-12 19 views
0

私は次のような状況で良いデザインを見つけようとしています。 私はデータとして一連のサービスが与えられるPOST restサービスを持っています。そして、それは順にそれらを1つずつ呼び出してサーバー上の結果を集約し、それらをクライアントに送り返すべきです。これらのサービスは、スタンドアロン呼び出すことができるので、1回のリクエストで複数のリソースにアクセスする方法:ジャージーレスト

@Path("/resource1") @Path("/resource2") @Path("/collection")

Post data to /collection {["serviceName": "resource1", "data":"test1"], ["serviceName":"resource2","data":"test2"]}

私はリソース1およびリソース2を必要とする理由は、あります。可能であれば同じ設定を再利用したい。 これを行う方法はありますか? 私は春にジャージーを使用しています。

答えて

1

これらのリソースに共通するものが不明です。 postメソッドのシグネチャがすべて同じであれば、postメソッドを定義する実装の抽象クラスまたはインタフェースを持ち、ResourceContext.matchResourceを使用してこのメ​​ソッドを試すことができます。例えば。

public abstract class AbstractResource { 
    public abstract String post(Object data); 
} 

@Path("/resource1") 
public class Resource1 extends AbstractResource { 
    @POST 
    public String post(String data) { 
     // do something 
    } 
} 

@Path("/collection") 
public class CollectionResource { 
    @Context 
    private ResourceContext rc; 

    @POST 
    @Consumes("application/json") 
    public String post(List<PostRequest> postRequests) { 
     StringBuilder result = new StringBuilder(); 
     for (PostRequest pr : postRequests) { 
      // should wrap this in try-catch 
      AbstractResource ar = rc.matchResource(pr.resource, 
        AbstractResource.class); 
      sb.append(ar.post(pr.data)); 
     } 
     return result.toString(); 
    } 
} 

@XmlRootElement 
public class PostRequest { 
    public String resource; 
    public String data; 
} 

あなたはそのアイディアを得て、あなたのニーズに合わせて調整することができれば幸いです。

+0

+1:話す共通点がなくても、それはもっと複雑になり(パースなど)、不可能ではありません。コンポジット操作を行う必要がある場合は、一連の命令をPOSTすることは適切です(これはRESTfulなIMOではなく、別のものです)。 –

関連する問題