WebServiceインタフェースの設計で発生した問題と解決プロセス

1599 ワード

サービス側には、次のようなクラスがあります.
public class User {
   private int id;
   private String name;
   ...
}
クエリー・インタフェースを定義するときに考えられる2つのシナリオがあります.
public User[] getUsers(String userName, String pwd, int groupId);
//クライアント呼び出しの定義には2つの結果しかありません.1つはクエリーするデータを得ることです.1つは
//空の配列を取得し、エラーメッセージが得られないのが欠点です.パスワードが間違っているのかgroupが存在しないのか
//やはり他の原因です...
public String getUsers(String userName, String pwd, int groupId);
//このように定義するとクライアントからエラーメッセージが表示されます
//ただし、オブジェクトが得られないという欠点があり、文字列を自分で解析してオブジェクトにカプセル化する必要がある
その後、フォーラムで質問して3つ目の案を得ました.
クラスをもう一つ書く
public class UserResponse {
   private String msg;
   private User[] users;
   ...
}

インタフェースは次のように定義できます.
public UserResponse getUsers(String userName, String pwd, int groupId);
//   server-config.wsdd   <beanMapping>
//             User[] 

乾かす準備をしていてまた一つの欠点を発見しました.User以外にもたくさんの種類があります.
クラスごとにXXXResponseと書いてカプセル化するのは面倒です
そこで達人に教えを求めて、もう一つの案を得ました.
インタフェースの定義
public Object[] getUsers(String userName, String pwd, int groupId);
//        , message  object[0], User[]   object[1]
//           
//             ,   object[1]          

クライアントがUserオブジェクトを生成していないことに気づきました.axis 2はインタフェースに基づいてwsdlファイルを生成するはずです.
そこで私はインタフェースに参加しました
public void doNothing(User user, XXX xxx ....);
//          User  

カスタム例外を投げ出してエラーメッセージを返すこともできるという人もいるでしょう.
皆さんの討論を歓迎します.あなたたちはどうやってやったのですか.