Professional Documents
Culture Documents
4 JAX-WS
ndice
Introduccin a SOAP
JAX-WS
SOAP (1)
SOAP (2)
Header (opcional)
Body (obligatorio)
SOAP (y 3)
[Ejemplo (fuente Wikipedia): servicio con operacin getProductDetails]
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetails xmlns="http://warehouse.example.com/ws">
<productID>827635</productID>
</getProductDetails>
</soap:Body>
</soap:Envelope>
Cliente
Servicio
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetailsResponse xmlns="http://warehouse.example.com/ws">
<getProductDetailsResult>
<productName>Toptimate 3-Piece Set</productName>
<productID>827635</productID>
<description>3-Piece luggage set. Black Polyester.</description>
<price currency="NIS">96.50</price>
<inStock>true</inStock>
</getProductDetailsResult>
</getProductDetailsResponse>
</soap:Body>
</soap:Envelope>
WSDL y UDDI
Registro UDDI
SOAP
Client
e
SOAP
SOAP
Servicio
De bajo nivel
De alto nivel
El skeleton
APIs de programacin (y 3)
Resto aplicacin
cliente
getProductDetails
<<interface>>
ProductManager
ProductManagerImpl
getProductDetails
Clase Proxy
Cliente
Skeleton
Servicio
ndice
Introduccin a SOAP
JAX-WS
Qu es JAX-WS? (1)
Qu es JAX-WS? (2)
Qu es JAX-WS? (y 3)
Proceso de desarrollo
Interfaz Java
Documento WSDL
Compilador Java
Compilador WSDL
Documento WSDL
Qu es Metro?
http://metro.dev.java.net/
Un conjunto de libreras
Un compilador de Java a WSDL
Un compilador de WSDL a Java
Axis 2 (http://ws.apache.org/axis2/)
CXF (http://cxf.apache.org/)
Ejemplo StockQuote
Servicio Web que ofrece una interfaz con una operacin que a
partir de un conjunto de identificadores de valores burstiles
devuelve sus cotizaciones
Cada cotizacin incluye
Su identificador
Su valor
El nmero de segundos de antigedad que tiene el valor (el valor
real actual sera ligeramente distinto)
SOAP/HTTP
Cliente
StockQuoteProvider
IncorrectTickerSymbolException
Mtodo de trabajo
Una aplicacin Web puede incluir uno o varios servicios Web SOAP
Es el modelo que estudiaremos
SOAP/HTTP
war
Cliente
Aplicaciones
Web (.war)
Servidor de aplicaciones
Componentes
EJB (.jar)
Servidor de aplicaciones
Modelo de ejecucin
SOAP/HTTP
Cliente
Servlet
Skeleton
Implementacin
del servicio
Servidor de aplicaciones
Ciclo de vida
es.udc.ws.jaxwstutorial.service.StockQuoteProviderImpl (1)
package es.udc.ws.jaxwstutorial.service;
import
import
import
import
import
import
import
javax.jws.WebMethod;
javax.jws.WebService;
javax.annotation.PostConstruct;
java.util.ArrayList;
java.util.HashMap;
java.util.List;
java.util.Map;
@WebService(
name="StockQuoteProvider",
serviceName="StockQuoteProviderService",
targetNamespace="http://ws.adoo.udc.es/"
)
public class StockQuoteProviderImpl {
private Map<String, TradePrice> tradePrices;
es.udc.ws.jaxwstutorial.service.StockQuoteProviderImpl (2)
@PostConstruct
private void init() {
TradePrice ibmTradePrice = new TradePrice();
ibmTradePrice.setTickerSymbol("IBM");
ibmTradePrice.setPrice(10.5);
ibmTradePrice.setElapsedSeconds(60*20);
TradePrice sunTradePrice = new TradePrice();
sunTradePrice.setTickerSymbol("SUN");
sunTradePrice.setPrice(9.1);
sunTradePrice.setElapsedSeconds(60*10);
TradePrice micTradePrice = new TradePrice();
micTradePrice.setTickerSymbol("MIC");
micTradePrice.setPrice(20.3);
micTradePrice.setElapsedSeconds(60*5);
tradePrices = new HashMap<String, TradePrice>();
tradePrices.put(ibmTradePrice.getTickerSymbol(),ibmTradePrice);
tradePrices.put(sunTradePrice.getTickerSymbol(),sunTradePrice);
tradePrices.put(micTradePrice.getTickerSymbol(),micTradePrice);
}
es.udc.ws.jaxwstutorial.service.StockQuoteProviderImpl (3)
public StockQuoteProviderImpl() {
}
@WebMethod(
operationName="getLastTradePrices"
)
public List<TradePrice> getLastTradePrices(List<String> tickerSymbols)
throws IncorrectTickerSymbolException {
List requestedTradePrices = new ArrayList();
System.out.println("Requested " + tickerSymbols.size() + " ticker
simbol(s)");
for (int i=0; i<tickerSymbols.size(); i++) {
TradePrice tradePrice= tradePrices.get(tickerSymbols.get(i));
es.udc.ws.jaxwstutorial.service.StockQuoteProviderImpl (y 4)
if (tradePrice == null) {
IncorrectTickerSymbolExceptionInfo info = new
IncorrectTickerSymbolExceptionInfo();
info.setIncorrectTickerSymbol(tickerSymbols.get(i));
throw new IncorrectTickerSymbolException(info);
}
requestedTradePrices.add(tradePrice);
}
System.out.println("Successfully resolved " +
requestedTradePrices.size() + " ticker simbol(s)");
return requestedTradePrices;
}
}
es.udc.ws.jaxwstutorial.servicedef.TradePrice (1)
package es.udc.ws.jaxwstutorial.service;
public class TradePrice {
private String tickerSymbol;
private double price;
private int elapsedSeconds;
public String getTickerSymbol() {
return tickerSymbol;
}
public void setTickerSymbol(String tickerSymbol) {
this.tickerSymbol = tickerSymbol;
}
public double getPrice() {
return price;
}
es.udc.ws.jaxwstutorial.service.TradePrice (y 2)
public void setPrice(double price) {
this.price = price;
}
public int getElapsedSeconds() {
return elapsedSeconds;
}
public void setElapsedSeconds(int elapsedSeconds) {
this.elapsedSeconds = elapsedSeconds;
}
}
es.udc.ws.jaxwstutorial.service.IncorrectTickerSymbolException
package es.udc.ws.jaxwstutorial.service;
import javax.xml.ws.WebFault;
@WebFault(name = "IncorrectTickerSymbolException", targetNamespace =
"http://ws.adoo.udc.es/")
public class IncorrectTickerSymbolException extends Exception {
private IncorrectTickerSymbolExceptionInfo exceptionInfo;
public IncorrectTickerSymbolException(IncorrectTickerSymbolExceptionInfo
exceptionInfo) {
this.exceptionInfo = exceptionInfo;
}
public IncorrectTickerSymbolExceptionInfo getFaultInfo() {
return exceptionInfo;
}
}
es.udc.ws.jaxwstutorial.service.IncorrectTickerSymbolExceptionInfo
package es.udc.ws.jaxwstutorial.service;
public class IncorrectTickerSymbolExceptionInfo {
protected String incorrectTickerSymbol;
public String getIncorrectTickerSymbol() {
return incorrectTickerSymbol;
}
public void setIncorrectTickerSymbol(String value) {
this.incorrectTickerSymbol = value;
}
}
Comentarios
IncorrectTickerSymbolExceptionInfo
Definicin
Definicin
Definicin
Definicin
Definicin
de
de
de
de
de
tipos de datos
mensajes
tipos de puertos
bindings
servicios
StockQuoteProviderService.wsdl (1)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://ws.adoo.udc.es/"
name="StockQuoteProviderService" xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://ws.adoo.udc.es/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<types>
<xsd:schema>
<xsd:import namespace="http://ws.adoo.udc.es/"
schemaLocation="StockQuoteProviderService_schema1.xsd"/>
</xsd:schema>
</types>
StockQuoteschema1.xsd (1)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://ws.adoo.udc.es/"
xmlns:tns="http://ws.adoo.udc.es/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="IncorrectTickerSymbolException" nillable="true"
type="tns:incorrectTickerSymbolExceptionInfo"/>
<xs:element name="getLastTradePrices" type="tns:getLastTradePrices"/>
<xs:element name="getLastTradePricesResponse"
type="tns:getLastTradePricesResponse"/>
<xs:complexType name="getLastTradePrices">
<xs:sequence>
<xs:element name="arg0" type="xs:string" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getLastTradePricesResponse">
<xs:sequence>
<xs:element name="return" type="tns:tradePrice" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
StockQuoteschema1.xsd (y 2)
<xs:complexType name="tradePrice">
<xs:sequence>
<xs:element name="elapsedSeconds" type="xs:int"/>
<xs:element name="price" type="xs:double"/>
<xs:element name="tickerSymbol" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="incorrectTickerSymbolExceptionInfo">
<xs:sequence>
<xs:element name="incorrectTickerSymbol" type="xs:string"
minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
StockQuoteProviderService.wsdl (2)
<message name="getLastTradePrices">
<part name="parameters" element="tns:getLastTradePrices"/>
</message>
<message name="getLastTradePricesResponse">
<part name="parameters" element="tns:getLastTradePricesResponse"/>
</message>
<message name="IncorrectTickerSymbolException">
<part name="fault" element="tns:IncorrectTickerSymbolException"/>
</message>
<portType name="StockQuoteProvider">
<operation name="getLastTradePrices">
<input message="tns:getLastTradePrices"/>
<output message="tns:getLastTradePricesResponse"/>
<fault message="tns:IncorrectTickerSymbolException"
name="IncorrectTickerSymbolException"/>
</operation>
</portType>
Definicin de mensajes
StockQuoteProviderService.wsdl (y 3)
<binding name="StockQuoteProviderPortBinding"
type="tns:StockQuoteProvider">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document"/>
<operation name="getLastTradePrices">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
<fault name="IncorrectTickerSymbolException">
<soap:fault name="IncorrectTickerSymbolException" use="literal"/>
</fault>
</operation>
</binding>
<service name="StockQuoteProviderService">
<port name="StockQuoteProviderPort"
binding="tns:StockQuoteProviderPortBinding">
<soap:address location="REPLACE_WITH_ACTUAL_URL"/>
</port>
</service>
</definitions>
Definicin de bindings
Definicin de servicios
En JAX-WS
Tipo Java
boolean
Tipo WSDL
xsd:boolean
byte
xsd:byte
short
xsd:short
int
xsd:int
long
xsd:long
float
xsd:float
double
xsd:double
Clases estndar
Tipo Java
Tipo WSDL
java.lang.String
xsd:string
java.math.BigInteger
xsd:integer
java.math.BigDecimal
xsd:decimal
java.util.Calendar
xsd:dateTime
java.util.Date
xsd:dateTime
Ejemplo: TradePrice
Ejemplo: StockQuoteProviderImpl
Excepciones
xsd:dateTime se mapea a
javax.xml.datatype.XMLGregorianCalendar (y no a
java.util.Calendar)
Los structs XML (con compositor all o sequence) se
mapean a una clase Java con mtodos getXXX/setXXX
para cada campo del struct
Adems, necesitamos saber como se mapean algunas
construcciones no existentes en JAVA (nuevamente, se usan
las normas de JAXB):
Ejemplo
Nombre: add
Parmetros: increment (in, double), amount (inout, double)
Sin tipo de retorno
Uso
Es el que usaremos.
es.udc.ws.jaxwstutorial.client.StockQuoteProviderClient (1)
package es.udc.ws.jaxwstutorial.client;
import
import
import
import
es.udc.ws.jaxwstutorial.wsdl.IncorrectTickerSymbolException;
es.udc.ws.jaxwstutorial.wsdl.StockQuoteProvider;
es.udc.ws.jaxwstutorial.wsdl.StockQuoteProviderService;
es.udc.ws.jaxwstutorial.wsdl.TradePrice;
import
import
import
import
import
javax.xml.ws.BindingProvider;
javax.xml.ws.WebServiceRef;
java.util.ArrayList;
java.util.List;
java.text.MessageFormat;
es.udc.ws.jaxwstutorial.client.StockQuoteProviderClient (2)
try {
if (args.length < 2) {
System.err.println(MessageFormat.format("Usage: {0}
stockQuoteProviderURL [tickerSymbol1 tickerSymbol2 ...]",
StockQuoteProviderClient.class.getName()));
System.exit(-1);
}
String stockQuoteProviderURL = args[0];
List<String> tickerSymbols = new ArrayList<String>();
for (int i=1; i < args.length; i++) {
tickerSymbols.add(args[i]);
}
StockQuoteProvider stockQuoteProvider =
stockQuoteProviderService.getStockQuoteProviderPort();
((BindingProvider)stockQuoteProvider).getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
stockQuoteProviderURL);
es.udc.ws.jaxwstutorial.client.StockQuoteProviderClient (y 3)
List<TradePrice> tradePrices =
stockQuoteProvider.getLastTradePrices(tickerSymbols);
// Show results
Comentarios (1)
StockQuoteProviderService
Comentarios (2)
Clientes Java EE
@WebServiceRef(wsdlLocation="http://localhost:9090/wsjaxwstutorial-service/services/StockQuotesService?wsdl"")
private static StockQuoteProvider service;
Ejemplo:
@WebServiceRef(name=service/StockQuoteProviderService)
Private static StockQuoteProvider service;
Comentarios (y 3)
<service-ref>
<service-ref-name>service/StockQuoteProviderService
</service-ref-name>
<service-interface>es.udc.ws.jaxwstutorial.wsdl.
StockQuoteProviderService</service-interface>
</service-ref>
ws-jaxwstutorialservice.war
Incluye
WEB-INF/lib
Incluye las libreras (ficheros .jar) de Metro
WEB-INF/classes
web.xml (1)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<display-name>JAXWSTutorial Web Service</display-name>
<servlet>
<servlet-name>WSServlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
web.xml (y 2)
<servlet-mapping>
<servlet-name>WSServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
Comentarios (1)
WSServlet
<servlet-mapping>
<servlet-name>WSServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
Comentarios (y 2)
WSServlet (cont)
sun-jaxws.xml
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'
version='2.0'>
<endpoint name='StockQuoteProvider'
implementation=
'es.udc.ws.jaxwstutorial.service.StockQuoteProviderImpl'
url-pattern='/services/StockQuotesService'/>
</endpoints>
Comentarios