23.3. An example web service
The example code that follows is from the seamBay example application, which can be found in Seam's
/examples
directory, and follows the recommended strategy outlined in the previous section. First, we will look at the web service class and one of its web service methods:
@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 }
Here, the web service is a stateless session bean annotated with the JWS annotations from the
javax.jws
package, as defined by JSR-181. The @WebService
annotation tells the container that this class implements a web service. The @WebMethod
annotation on the login()
method identifies the method as a web service method. The name
and serviceName
attributes in the @WebService
annotation are optional.
When the web service is a stateless session bean, each method that will be exposed as a web service method must also be declared in the remote interface of the web service class. In the previous example, since the
AuctionServiceRemote
interface is annotated as a @WebService
, it must declare the login()
method.
In the previous example, the web service implements a
login()
method that delegates to Seam's built-in Identity
component. As our recommended strategy suggests, the web service is written as a simple facade. The real work takes place in a Seam component. This means that business logic is reused efficiently between web services and other clients.
In the following example, the web service method begins a new conversation by delegating to the
AuctionAction.createAuction()
method:
@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); }
The code from
AuctionAction
is as follows:
@Begin public void createAuction() { auction = new Auction(); auction.setAccount(authenticatedAccount); auction.setStatus(Auction.STATUS_UNLISTED); durationDays = DEFAULT_AUCTION_DURATION; }
Here, we see how web services can participate in long-running conversations by acting as a facade and delegating the real work to a conversational Seam component.