Algo más elaborado


(Imagen: Rembrandt - Descenso de la cruz)

Veamos el siguiente servicio:

package ch01.team;

import java.util.List;
import javax.jws.WebService;
import javax.jws.WebMethod;

@WebService
public class Teams{
private TeamsUtility utils;

public Teams(){
utils = new TeamsUtility();
utils.make_test_teams();
}

@WebMethod
public Team getTeam(String name){
return utils.getTeam(name);
}

@WebMethod
public List getTeams(){
return utils.getTeams();
}
}


El servicio Teams ha sido implementado en una sóla clase Java, en vez de usar una SEI y un SIB. La operación getTeam recibe un parámetro y retorna una instancia de Team, que es un tipo definido por el programador, que ha su vez es una lista de instancias de Player (otro tipo definido por el programador). Por otro lado, la operación getTeams nos devuelve List, o sea una colección Java.

En un post anterior, se vio que la SEI para el servicio TimeServer contenía la siguiente anotación:

@SOAPBinding(style = Style.RPC)

Esta anotación requiere que el servicio utilice sólamente tipos simples, como String e Integer. Sin embargo, el servicio Teams utiliza tipos más complejos, por lo que el estilo a utilizar es Style.DOCUMENT (el valor por defecto). Este estilo requiere más trabajo de configuración.

Para desplegar el Web Service es necesario compilar a todas las clases involucradas: TeamService, Team, Player, TeamsUtility y TeamsPublisher, cuyo código es:


package ch01.team;

import javax.xml.ws.Endpoint;

class TeamPublisher{
public static void main(String[] args){
int port= 8888;
String url = "http://localhost:"+ port+ "/teams";
System.out.println("Publicando teams en el puerto: " + port);
Endpoint.publish(url, new Teams());
}
}


Ahora necesitaremos la ayudita de wsgen, que está incluido en core Java 6. wsgen generará varios artefactos, entre los que están las clases Java que necesita Endpoint.publish para generar el WSDL.

Ahora si podemos ejecutar TeamPublisher y tener nuestro WS operativo. Para generar el cliente podemos recurrir a wsimport (también en core Java 6), con lo que tendríamos algo como esto:


import teamsC.TeamsService;
import teamC.Teams;
import teamsC.Team;
import teamsC.Player;
import java.util.List;

class TeamClient{
public static void main(String[] args){
TeamsService service = new TeamsService();
Teams port = service.getTeamsPort();
List teams = port.getTeams();
for (Team team: teams){
//...
}
}
}


Basado en el capítulo 1 de Java Web Services: Up and Running de Martin Kalin

Publicar un comentario