CXF para servios Web

Ahora abro el tópico sobre el framework CXF para la generación de WebServices,
sobre este tema podemos decir que es bastante sencillo de implementar Servicios Web con este framework y que en tiempo de ejecución es mucho más rápido que Axis 2 pero inferior a Metro de la Sun.
Basta con tener una clase POJO con su consabida implementación a si por ejemplo


package demo.order;

public class Order {

/*propiedades del POJO*/

private String customerID;

private String itemID;

private int qty;

private double price;

// Constructor

public Order() {

}

public String getCustomerID() {

return customerID;

}

public void setCustomerID(String customerID) {

this.customerID = customerID;

}

public String getItemID() {

return itemID;

}

public void setItemID(String itemID) {

this.itemID = itemID;

}

public int getQty() {

return qty;

}

public void setQty(int qty) {

this.qty = qty;

}

public double getPrice() {

return price;

}

public void setPrice(double price) {

this.price = price;

}

}

como se ve no hay mayor novedad sobre la construcción de nuestra clase

ahora bien, deberíamos de crear una interfaz a la que posteriomente accederemos


package demo.order;

import javax.jws.WebService;

/*anotacion que define al web service*/

@WebService

public interface OrderProcess {

String processOrder(Order order);

}

note la anotación java @WebService que define a esta interfaz como un servicio Web, a lo cual debería de seguir la implementación de esta interfaz


package demo.order;

import javax.jws.WebService;

/*implementacion del servicio*/

@WebService

public class OrderProcessImpl implements OrderProcess {

public String processOrder(Order order) {

String orderID = validate(order);

return orderID;

}

/**

* Valida la orden y retorna el ID de la orden

**/

private String validate(Order order) {

String custID = order.getCustomerID();

String itemID = order.getItemID();

int qty = order.getQty();

double price = order.getPrice();

if (custID != null && itemID != null && !custID.equals(“”) && !itemID.equals(“”) && qty > 0 && price > 0.0) {

return “ORD1234″;

}

return null;

}

}

Ahora debemos de construir un archivo que cargue el contexto de nuestro servicio Web al que llamamos beans.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:jaxws="http://cxf.apache.org/jaxws"
 xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
 <import resource="classpath:META-INF/cxf/cxf.xml" />
 <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
 <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
 <jaxws:endpoint
  id="orderProcess"
  implementor="demo.order.OrderProcessImpl"
  address="/OrderProcess" />

</beans>

en este archivo podrían ir todas las referencias a las implementaciones de los servivios Web.

para terminar el lado de servidor debemos de escribir el web.xml de la aplicación.
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<!DOCTYPE web-app
PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”
“http://java.sun.com/dtd/web-app_2_3.dtd”>
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
notar que se hace referencia al archivo beans.xml
Para saber si todo va bien debemos de escribir el cliente de este servicio Web
package demo.order.client;
import demo.order.OrderProcess;
import demo.order.Order;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public final class Client {
public Client() {
}
public static void main(String args[]) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] "demo/order/client/client-beans.xml"});
OrderProcess client = (OrderProcess) context.getBean("orderClient");
Order order = new Order();
order.setCustomerID("C001");
order.setItemID("I001");
order.setQty(100);
order.setPrice(200.00);
String orderID = client.processOrder(order);
String message = (orderID == null) ? "Orden no aprobada" : "Orden aprobada; el ID de la orden es " + orderID;
System.out.println(message);
}
}
y el archivo que carga el bean del contexto
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:jaxws=”http://cxf.apache.org/jaxws”
xsi:schemaLocation=”
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd”>
<jaxws:client id=”orderClient” serviceClass=”demo.order.OrderProcess” address=”http://localhost:8080/orderapp/OrderProcess” >
</jaxws:client>
</beans>
Esito sería claro que deberían de tener el conjunto de librerías necesarias para que compile y ejecute.
para ello les paso la direccion en Mediafire de donde descargar el proyectito, el cual esta hecho en eclipse.
This entry was posted in Java. Bookmark the permalink.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos requeridos, están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>