2017-03-04 5 views
0

私はAndroidクライアントに公開しているいくつかのエンドポイントクラスを持っています。これらのエンドポイントのメソッドは、エンティティ型パラメータを使用します。エンドポイントが@Apiアノテーションで公開されていることをご存知のように、エンティティタイプのパラメータに@Apiを注釈していません。私が直面している問題は、これらのエンドポイントがエンティティクラスのセットを共有することですが、エンドポイントのライブラリを生成するとき、これらのエンティティタイプは同じクラスの各エンドポイントに対して生成されます。私はすべてのエンドポイントに対して共通のクラスを用意したいと思っていました。私は、問題を詳しく説明するためにあなたに例を挙げてみましょう:Googleクラウドのエンドポイント間でクラスを共有するにはどうすればよいですか?

は、私は、注釈付きのエンドポイントを持っている、と言うことができます:

@Api(
     name = "learnerProfileVer1Api", 
     version = "v1", 
     resource = "learnerProfileVer1", 
     namespace = @ApiNamespace(
       ownerDomain = "create.account.backend.learncity.com", 
       ownerName = "create.account.backend.learncity.com", 
       packagePath = "" 
     ) 
) 
public class Endpoint1{ 

@ApiMethod(
      name = "insert", 
      path = "learnerProfileVer1", 
      httpMethod = ApiMethod.HttpMethod.POST) 
    public LearnerProfileVer1 insert(LearnerProfileVer1 learnerProfileVer1) {....} 

} 

、あなたが上記に見ることができる別のエンドポイント、

@Api(
     name = "searchApi", 
     version = "v1", 
     title = "Search API", 
     namespace = @ApiNamespace(
       ownerDomain = "learncity.com", 
       ownerName = "Learncity", 
       packagePath = "" 
     ) 
) 
public class SearchTutorsEndpoint { 

@ApiMethod(name = "searchTutors", 
      httpMethod = ApiMethod.HttpMethod.POST) 
    public CollectionResponse<TutorProfileVer1> searchTutors(SearchTutorsQuery searchTutorsQuery, @Nullable @Named("cursor") String cursor, @Nullable @Named("limit") Integer limit) {...} 

} 

私がLearnerProfileVer1と​​エンティティタイプのパラメータを持っている2つのエンドポイント。これらの2つのクラスは、共通するいくつかの他のクラスを使用します。

さて、私はクライアント-LIBSを生成するとき、私は同じクラスで別々のmodelのパッケージを持っていること、それはこれらのクラスを持っていると私はSearchApiに対して個別にクライアントのlibを取得することでmodelパッケージを持っているlearnerProfileVer1Apiために1を取得。この問題は、クライアントコードをこれらのクライアントライブラリにリンクすると拡大し、同じクラスの3つの異なるバージョンが見つかります。

これらのクラスに1組のclient-libが生成されるようにするソリューションはありますか?

答えて

0

この問題の解決策はありませんが、Multiclass APIを使用して見つかった問題があります。私はクライアント側で自分のコードを壊したバックエンドコードを再設計しなければなりませんでしたが、それは価値があり、プロジェクトの複雑さが増すとそれを実現します。とにかく、Multiclass API hereについて読むことができます。

ここでは簡単な例を示します。

/** 
    * An endpoint class we are exposing 
    */ 
    @Api(
      name = "userApi", 
      version = "v1", 
      namespace = @ApiNamespace(
        ownerDomain = "backend.myapplication.DJ.example.com", 
        ownerName = "backend.myapplication.DJ.example.com", 
        packagePath = "" 
      ) 
    ) 
    @ApiClass(
      resource = "account" 
    ) 
    public class AccountEndpoint { 

     /** 
     * A simple endpoint method that takes a name and says Hi back 
     */ 
     @ApiMethod(name = "sayHi") 
     public MyBean sayHi(@Named("name") String name) { 
      MyBean response = new MyBean(); 
      response.setData("Hi, " + name); 

      return response; 
     } 

    } 


/** 
* Another endpoint class we are exposing 
*/ 
@Api(
     name = "userApi", 
     version = "v1", 
     namespace = @ApiNamespace(
       ownerDomain = "backend.myapplication.DJ.example.com", 
       ownerName = "backend.myapplication.DJ.example.com", 
       packagePath = "" 
     ) 
) 
@ApiClass(
     resource = "search" 
) 
public class SearchEndpoint { 

    private static final Logger logger = Logger.getLogger(SearchEndpoint.class.getName()); 

    /** 
    * This method gets the <code>MyBean</code> object associated with the specified <code>id</code>. 
    * 
    * @param id The id of the object to be returned. 
    * @return The <code>MyBean</code> associated with <code>id</code>. 
    */ 
    @ApiMethod(name = "getMyBean") 
    public MyBean getMyBean(@Named("id") Long id) { 
     // TODO: Implement this function 
     logger.info("Calling getMyBean method"); 
     return null; 
    } 

    /** 
    * This inserts a new <code>MyBean</code> object. 
    * 
    * @param myBean The object to be added. 
    * @return The object to be added. 
    */ 
    @ApiMethod(name = "insertMyBean") 
    public MyBean insertMyBean(MyBean myBean) { 
     // TODO: Implement this function 
     logger.info("Calling insertMyBean method"); 
     return myBean; 
    } 
} 

重要なのは、あなたは2つのAPIは@APIClass注釈内のリソースによって異なることがここで見ることができます。

これらの2つのエンドポイントは、アカウント関連のリクエストを受け入れ、ユーザの検索関連のリクエストを受け入れます。これは、2つのAPI(userApiでグループ化されている)の論理的な関係です。それは悪くは見えませんが、同じパッケージ内のすべてのエンドポイントメソッドと、少し面倒なテストやテストを行うことができるAPIエクスプローラは終了しますが、それ以外の場合。このソリューションは、既存のエンドポイントが使用するクラスの少なくとも1つにアクセスする別のAPIを追加するとさらに退屈になります。あなたはそれを既存のAPIに含めることを余儀なくされます。この新しいAPIに共通のエンティティが1つまたは2つしかない場合は、同じAPIでグループ化しないで、クライアント側で意義のない設計上の妥協を受ける可能性があります(クライアント側の特別なケースとしてこれらの重複したモデルクラスを扱います)

マルチクラスAPIを使用している場合

次の点を心に留めておくべきである:APIのアイデンティティがすべてのエンドポイントで同じである

  • ので、メソッド名が異なる署名を持っている必要があります。
  • 2つの異なるメソッドが同じRESTパスを持つことはありません。
  • リソース、メソッド名、APIメソッド名をできるだけ論理的な名前にして、より新しいAPIをグループ化するときにこれらの名前を構築できるようにします。
関連する問題