23.3. Web サービスの例
ここで例示するコードは seamBay サンプルアプリケーションからのコードです。これは Seam の
/examples ディレクトリにあり、前項で述べた推奨される方法に添っています。 まず、 Web サービスのクラスとその Web サービスのメソッドから見てみましょう。
@Stateless
@WebService(name = "AuctionService", serviceName = "AuctionService")
public class AuctionService implements AuctionServiceRemote
{
@WebMethod
public boolean login(String username, String password)
{
Identity.instance().setUsername(username);
Identity.instance().setPassword(password);
Identity.instance().login();
return Identity.instance().isLoggedIn();
}
// snip
}
この Web サービスは JSR-181 で定義されている通り、
javax.jws パッケージの JWS アノテーションが付与されたステートレスセッション Bean です。@WebService アノテーションがコンテナにこのクラスが Web サービスを実装することを伝えます。login() メソッドにある @WebService アノテーションはメソッドを Web サービスメソッドとして識別します。 @WebService アノテーションの name と serviceName の属性はオプションです。
Web サービスがステートレスセッション Bean である場合は、 Web サービスメソッドとして公開される各メソッドも Web サービスクラスのリモートインターフェース内で宣言される必要があります。 上記の例では、
AuctionServiceRemote インターフェースが @WebMethod でアノテーションが付与されているため、 login() メソッドを宣言しなければなりません。
上記の例にあるように、 Web サービスは Seam の組み込みの
Identity コンポーネントに委譲する login() メソッドを実装します。 推奨方法で提示しているように、 Web サービスは単にファサードとして記述されています。 実際の作業は Seam コンポーネント内で行われます。 つまり、 Web サービスと他のクライアント間でビジネスロジックは効率的に再利用されるということです。
次の例では、 この Web サービスメソッドは
AuctionAction.createAuction() メソッドに委譲することで新しい対話を開始しています。
@WebMethod
public void createAuction(String title, String description, int categoryId)
{
AuctionAction action =
(AuctionAction) Component.getInstance(AuctionAction.class, true);
action.createAuction();
action.setDetails(title, description, categoryId);
}
以下は、
AuctionAction からのコードです。
@Begin
public void createAuction()
{
auction = new Auction();
auction.setAccount(authenticatedAccount);
auction.setStatus(Auction.STATUS_UNLISTED);
durationDays = DEFAULT_AUCTION_DURATION;
}
ここでは、ファサードとして動作し実際の作業を対話型 Seam コンポーネントに委譲することで、Web サービスが長期実行の対話に参加する方法を示しています。