Iniciar sesión

Crear un webservice usando cxf2

Rodrigo

Traducido por Rodrigo

Creado 2014-07-26 07:08:06 Modificado 2014-09-17 23:29:25

Apache CXF es un framework para desarrollar webserivces el cual automáticamente "marshallea" los objetos a retornar, con esto podemos decir, bien este método retornará un objeto plano "Usuario" o objeto "Libro" y el webservice retirnará un objeto "marshalleado" (objeto como xml) o una lista de objetos "marshalleados"

En este tutorial vamos a usar este framework, para desarrollar un webservice que retornará una lista de "User" y un objeto simple "User"

este tutorial fue escrito usando el siguiente equipo:

  • Hardware:           laptop Thinkpad E430 Intel I5, 4gb Ram, 500gb HDD
  • SO:                    x86_64 GNU/Linux Ubuntu 14.10
  • Kernel:               3.13.0-32-generic
  • IDE/Text editor:   Eclipse Java EE IDE for Web Developers Version: Kepler Service Release 2
  • JDK:                   Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
  • Cxf:                    apache-cxf-2.6.13
  • Tomcat:              apache-tomcat-6.0.35 (como servidor de aplicaciones)
  • Browser:             Chromium Version 34.0.1847.116 Ubuntu 14.04 aura (260972)

 

1.- Instalando el ambiente:

Primero necesitamos instalar el ambiente cxf, vamos a http://cxf.apache.org/download.html descarga el framwork, extráelo donde quieras, ahora en eclipse ve a windows => preferences => Web Services => CXF 2.x Preferences y haz click en add

luego haz click en browse

y pon la ruta donde extrajiste cxf

como puedes ver al dar el path, automáticamente reconoce la versión y el "type", ahora hacemos click en finish

ahora hacemos click en el checkbox, luego apply y luego ok, y eso es todo, hemos instalado el ambiente para trabajar con CXF

2.- Creando el proyecto web service:

Una vez instalado el ambiente cxf, podemos crear nuestro proyecto para trabajar con cxf, en eclipse ve a file => new => Project... y escribe dynamic, elige el "Dynamic web project" y haz click en next

aquí ponemos el nombre del proyecto "webServiceCxf2" y hacemos click en modify, para añadir el facet de CXF

aquí hacemos click en el checkbox CXF2.x y luego ok

aquí hacemos click en finish y ya tendremos nuestro proyecto con el facet CXF cargado

 

3.- Creando las clases:

Ahora estamos listos para poder desarrollar los métodos del webservice, vamos a crear el bean User en el package com.rrivero.model:

package com.rrivero.model;

import java.io.Serializable;

public class User implements Serializable{

	private static final long serialVersionUID = 1L;
	
	private long id;
	private String name;
	private String surname;
	private String address;
	private int age;
	private boolean premiumCustomer;	
	
	public User() {}
	
	public User(long id, String name, String surname, String address, int age,boolean premiumCustomer) {
		this.id = id;
		this.name = name;
		this.surname = surname;
		this.address = address;
		this.age = age;
		this.premiumCustomer = premiumCustomer;
	}
	
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSurname() {
		return surname;
	}
	public void setSurname(String surname) {
		this.surname = surname;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public boolean isPremiumCustomer() {
		return premiumCustomer;
	}
	public void setPremiumCustomer(boolean premiumCustomer) {
		this.premiumCustomer = premiumCustomer;
	}
	
	
}

ahora vamos a crear los métodos del webservices que los cuales retornan una lista de User y un simple User, vamos a crear la clase la clase de "webservice" en el package com.rrivero.web:

package com.rrivero.web;

import java.util.ArrayList;
import java.util.List;

import com.rrivero.model.User;

public class UserMngt {
	
	public User findById(long id){
		
		//here we should have read the user by id going to the database, we are not using databases here so we fill the object without db
		User user =  new User(id, "Rodrigo", "Rivero", "Santiago", 23, true);
		return user;
	}
	
	public List findByName(String name){
		
		//here we should have read the user by id going to the database, we are not using databases here so we fill the object without db
		List userList= new ArrayList();
		User user1 =  new User(1, name, "Rivero", "Santiago", 23, true);
		User user2 =  new User(2, name, "Sáez", "Concepción", 17, false);
		userList.add(user1);
		userList.add(user2);
		return userList;
	}

}

4.- Creando el webservice:

Hasta aquí hemos creado las clases; el bean User el cual es un simple bean, y la clase UserMngt la cual contiene la lógica retornando una lista de User y un simple User usando 2 diferentes métodos, ahora creemos en webservice publicando esos 2 métodos

Hacemos click derecho sobre la clase UserMngt => Web Services => Create Web Service y seleccionamos la opción runtime

aquí seleccionamos  Apache CXF 2.x, y como server Tomcat x

ahora hacemos click en finish y esperamos; lo que elcipse está haciendo es crear el webservice, publicando los métodos de la clase seleccionada (UserMngt) y levantando tomcat

si el mundo es feliz hasta este punto deberíamos tener la siguiente lista de directorios

 

5.- Probando el webservice:

Hasta este punto estamos listos, ahora vamos a http://127.0.0.1:8090/webServiceCxf2/services verás la siguiente página:

luego para ver el wsdl haz click en el link WSDL: y verás la siguiente página:

 

probando con soapui; método findById request:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://web.rrivero.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:findById>
         <arg0>1</arg0>
      </web:findById>
   </soapenv:Body>
</soapenv:Envelope>

método findById response:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:findByIdResponse xmlns:ns2="http://web.rrivero.com/">
         <return>
            <address>Santiago</address>
            <age>23</age>
            <id>1</id>
            <name>Rodrigo</name>
            <premiumCustomer>true</premiumCustomer>
            <surname>Rivero</surname>
         </return>
      </ns2:findByIdResponse>
   </soap:Body>
</soap:Envelope>

probando con soapui; método findByName request:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://web.rrivero.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:findByName>
         <!--Optional:-->
         <arg0>Rodrigo</arg0>
      </web:findByName>
   </soapenv:Body>
</soapenv:Envelope>

método findByName response:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:findByNameResponse xmlns:ns2="http://web.rrivero.com/">
         <return>
            <address>Santiago</address>
            <age>23</age>
            <id>1</id>
            <name>Rodrigo</name>
            <premiumCustomer>true</premiumCustomer>
            <surname>Rivero</surname>
         </return>
         <return>
            <address>Concepción</address>
            <age>17</age>
            <id>2</id>
            <name>Rodrigo</name>
            <premiumCustomer>false</premiumCustomer>
            <surname>Sáez</surname>
         </return>
      </ns2:findByNameResponse>
   </soap:Body>
</soap:Envelope>

 

 

Descárgalo en https://drive.google.com/file/d/0BwOqSob-RrBOOEk5WUx6RFVQQWs/edit?usp=sharing

6.- Conclusión:

como puedes ver CXF2.x permite retornar objetos como quieras, sin tener que serializar los objetos por timismo, realmente recomiendo usar este framework en vez de apache axis, es muy simple de usar y no tienes que preocuparte de marshallear objetos

7.- Links de referencias:




comments powered by Disqus