Dev (Back & Front)ARTIGO

Spring + XFire == Qualidade + Facilidade

O XFire é a próxima geração de
frameworks SOAP com um modelo de mensagens leves usado para integrar
mensagens SOAP via STAX. Ele tem uma integração muito boa com o Spring Framework. Vou mostrar um exemplo de como fazer isso.

O primeiro passo é definir uma interface. Neste exemplo, vou definir a interface hora.

package org.diegopaheco.springxfire.model;<br />import javax.jws.WebService;<br /><br />@WebService<br />public interface Hora {<br />  public String getDateTime();<br />}

Como vocês devem ter percebido eu só usei a annotation @WebService no XFire.

Agora, vamos criar um serviço que implementa essa interface.

package org.diegopaheco.springxfire.model;<br /><br />import java.util.Date;<br /><br />import javax.jws.WebService;<br /><br />@WebService(serviceName = "HoraService", endpointInterface = "org.diegopaheco.springxfire.model.Hora")<br />public class HoraImpl implements Hora {<br /><br />     @SuppressWarnings("deprecation")<br />     public String getDateTime() {          <br />          return new Date().toLocaleString();<br />     }<br /><br />}

Aqui temos a implementação da interface Hora e uma outra annotation: @WebService(serviceName
= “HoraService”, endpointInterface =
“org.diegopaheco.springxfire.model.Hora”) que define o nome do
Servilo(HoraService). Poderia ser qualquer outro e qual a interface
desse serviço, nesse caso: org.diegopaheco.springxfire.model.Hora.

Agora vamos aos arquivos de configurações.

Existe um arquivo “padrão” que é o xfire-servlet.xml.

<?xml version="1.0" encoding="UTF-8"?><br /><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><br /><beans><br /><br /> <bean id="webAnnotations" <br />     class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations"<br /> /><br /><br /> <bean id="handlerMapping" class="org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping"><br />        <property name="typeMappingRegistry"><br />            <ref bean="xfire.typeMappingRegistry"/><br />        </property><br />        <property name="xfire"><br />            <ref bean="xfire"/><br />        </property><br />        <property name="webAnnotations"><br />            <ref bean="webAnnotations"/><br />        </property><br /> </bean><br /><br /> <bean <br />      class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"<br /> > <br />      <property name="urlMap"> <br />           <map> <br />               <entry key="/"><br />                   <ref bean="handlerMapping"/><br />               </entry><br />           </map><br />      </property><br /> </bean><br /><br /> <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/> <br /><br /></beans>

No web.xml declaramos um servlet do XFire + o listener padrão do Spring.

<?xml version="1.0" encoding="UTF-8"?><br /><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"><br /><br />     <context-param><br />          <param-name>contextConfigLocation</param-name><br />         <param-value><br />                      /WEB-INF/applicationContext.xml,<br />                  /WEB-INF/xfire-servlet.xml<br />          </param-value><br />        </context-param><br /><br />    <listener><br />            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class><br />     </listener><br /><br />     <!--<br />     <servlet><br />          <servlet-name>context</servlet-name><br />          <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class><br />          <load-on-startup>1</load-on-startup><br />     </servlet><br />     --><br /><br />     <servlet><br />          <servlet-name>XFireServlet</servlet-name><br />          <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class><br />    </servlet><br /><br />     <servlet-mapping><br />          <servlet-name>XFireServlet</servlet-name><br />          <url-pattern>/servlet/XFireServlet/*</url-pattern><br />     </servlet-mapping><br /><br />     <servlet-mapping><br />          <servlet-name>XFireServlet</servlet-name><br />          <url-pattern>/services/*</url-pattern><br />     </servlet-mapping><br /><br /></web-app>

E, finalmente, o applicationContext.xml do Spring, onde definimos os beans do Spring.

<?xml version="1.0" encoding="UTF-8"?><br /><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><br /><beans><br />      <bean id="annotatedHora" <br />            class="org.diegopaheco.springxfire.model.HoraImpl"<br />      />       <br /><br /></beans>

Para
podermos expor o service do spring com o XFire são necessários annotations + um serviço implementado + a definição do serviço como um
spring bean.

Agora um programa de teste(client)

package org.diegopaheco.springxfire.test;<br /><br />import java.net.MalformedURLException;<br /><br />import org.codehaus.xfire.annotations.AnnotationServiceFactory;<br />import org.codehaus.xfire.client.XFireProxyFactory;<br />import org.codehaus.xfire.service.Service;<br />import org.diegopaheco.springxfire.model.Hora;<br />import org.diegopaheco.springxfire.model.HoraImpl;<br /><br />public class TestRunnerHora {<br /><br />     public static void main(String[] args) {<br />          Service serviceModel = new AnnotationServiceFactory()<br />                    .create(HoraImpl.class);<br /><br />          try {<br />               Hora service = (Hora) new XFireProxyFactory().create(<br />                         serviceModel,<br />                         "http://localhost:8080/Spring-Xfire/services/HoraService");<br /><br />               System.out.println("DateTime from web-service: " + service.getDateTime());<br /><br /><br />          } catch (MalformedURLException e) {<br />               e.printStackTrace();<br />          }<br /><br />     }<br /><br />}

Por hoje é só!

é Técnico em Processamento de Dados e graduando em Ciências da Computação(7º sem.) na Ulbra. Já trabalhou com desenvolvimento de software em VB, ASP, .NET e PHP. Atualmente é Arquiteto de Software criando soluções corporativas em Java. Certificado pela SUN com SCJP 5 e SCWD 5. Mantém o blog (diego-pacheco.blogspot.com).

Ver perfil