05 septiembre 2006

WebServices con XFire, Annotations y Spring

Bueno, es bastante sencillo, primero bajate el paquete de XFire desde aquí. Necesitarás un monton de librerías adicionales, pero están listadas aquí. En la distribución de XFire vienen todas las librerías necesarias menos una, stax, que la puedes bajar desde aquí (bájate la última disponble). Copialas a tu WEB-INF/lib y añadelas a tu classpath (para compilar solo necesitas xfire-jsr181-api-1.0-M1.jar y xfire-all-1.2-jar)

Lo siguiente que hay que hacer es definir el/los interfaces de tus servicios. Es super simple:
package com.bcurtu.xfire;

import javax.jws.WebService;

@WebService
public interface AccountValidator {

public boolean isValidAlias(String alias);

public int blockAccount(String alias);

public int forceDeleteAccount(String alias);
}


Y a continuación implementarlos:

package com.bcurtu.xfire;

import javax.jws.WebService;
import com.bcurtu.db.AccountDaoHibernate;
@WebService(
serviceName = "AccountService",
endpointInterface = "com.bcurtu.xfire.AccountValidator"
)
public class AccountValidatorImpl extends AccountDaoHibernate implements AccountValidator{

}
En este caso extendemos el Dao que hace exactamente lo especificado en la interface. Se puede ver que la annotation define el nombre y el interface que utiliza

Hasta aquí tu trabajo de programación, lo demás es casi un copy-paste. Create un applicationContext.xml de Spring (o reutiliza cualquier otro que ya tengas) y añade esto:
<beans>

<bean id="webAnnotations"
class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations"/>

<bean id="handlerMapping"
class=" org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping">
<property name="typeMappingRegistry" ref="xfire.typeMappingRegistry"/>
<property name="xfire" ref="xfire"/>
<property name="webAnnotations" ref="webAnnotations"/>
</bean>

<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>

<!-- List here your WebServices classes -->
<bean id="accountValidator" class="com.bcurtu.xfire.AccountValidatorImpl">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>


</beans>

Los dos primeros beans hacen el trabajo por tí. El tercero simplemente debe existir para que Spring cree los objetos.

Lo siguiente también es copy-paste. En tu web.xml, añade la ruta a los web services:

<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
..........
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/xfire/*</url-pattern>


Y nada más! Haz un deploy de tu applicación, y en http://127.0.0.1:8080/tuapplicacion/xfire/AccountService?wsdl encontrarás el descriptor



El código se puede encontrar en (usando svn) https://tempmail.googlecode.com/branches/TempMailExp (acuérdate de poner el https, que si no no podrás hacer commits!)

5 comentarios:

Anónimo dijo...
Un administrador del blog ha eliminado esta entrada.
Eliseo dijo...

Hola, intenté bajar el código usando TortoiseSVN de aquí https://tempmail.googlecode.com/branches/TempMailExp

Al parecer hay un error.

Muy buen artículo!

Bosco dijo...

Hole Eliseo, prueba a bajarte el código desde el trunk. Como he estado continuamente evolucionando el proyecto utilizando una y otra tecnología, cuando reuní un conjunto de features suficiente lo moví todo al trunk.
Si no quieres hacer commits sobre mi proyecto, o no tienes usuario de google code prueba la url http://tempmail.googlecode.com/svn/trunk/
Hay está el proyecto para Eclipse TempAlias.
Bajalo.
También verás que he añadido una capa service (BestPractices) y el WebService ahora accede a esta capa en vez de utilizar el DAO directamente. Es mejor así. De todas maneras, en cuanto a configuración todo es igual.
Saludos

Anónimo dijo...

Hola, he colocado XFire en un servidor Tomcat creando una aplicacion llamada simplemente xfire.

Dentro de WEB-INF/lib coloque todas las jars requeridas.

Dentro de METAINF/xfire el archivo services.xml

Vamos bien ??
Saludos
Juan M Wagner
jwagner@uabc.mx

Luz Elena Plaz Rojo dijo...

Hola a todos, por fa, necesito trabajar en seguridad para Ws en Xfire y la verdad, todo lo que he leído hasta ahora me ha confundido mucho, si tiene alguna información interesante que me pueda servir ya sea de wss4j o acegi o por el estilo con Seguridad, le agradecería mucho. saludos y gracias