用Xfire将grails的服务展现为WebService

来源:互联网 发布:火鸟中文编程 编辑:程序博客网 时间:2024/05/01 05:16

Xfire框架可以用很简易的方法将POJO展现为WebService ,而且Xfire还提供和spring的集成,可以很方便的将springbean展现为WebServiceGrailsservice在运行时会被srping托管,成为一个bean,因此可以用Xfire将其展现为WebService。将grailsservice展现为WebService的步骤如下:

 

1.         下载Xfire,将xfire和其依赖的jar复制到grails项目的lib目录中,展现WebService至少需要如下jar文件:

activation-1.1.jar

jaxen-1.1-beta-9.jar

jdom-1.0.jar

stax-api-1.0.1.jar

stax-utils-20040917.jar

wsdl4j-1.6.1.jar

wss4j-1.5.1.jar

wstx-asl-3.2.0.jar

xfire-all-1.2.6.jar

xfire-jsr181-api-1.0-M1.jar

 

2.         为了让web容器将url请求转为web service,需要在web.xml中添加xfireservlet处理器,由于grailsweb.xml是根据模板动态生成的,因此需要修改grails安装目录下src/war/WEB-INF/web2.4.template.xml文件,在其中添加如下信息:

<servlet>

           <servlet-name>XFireServlet</servlet-name>

           <display-name>XFire Servlet</display-name>

           <servlet-class>

               org.codehaus.xfire.spring.XFireSpringServlet

           </servlet-class>

  </servlet>

 

<servlet-mapping>

           <servlet-name>XFireServlet</servlet-name>

           <url-pattern>/servlet/XFireServlet/*</url-pattern>

</servlet-mapping>

 

 <servlet-mapping>

           <servlet-name>XFireServlet</servlet-name>

           <url-pattern>/services/*</url-pattern>

 </servlet-mapping>

 

 

contextConfigLocation<param-value>中添加classpath:org/codehaus/xfire/spring/xfire.xml,修改后内容如下:

<context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/applicationContext.xml,classpath:org/codehaus/xfire/spring/xfire.xml</param-value>

    </context-param>

 

Xfire.xml位于xfire-all-1.2.6.jar中,其中定义了集成spring时要用到的bean

另外还要修改urlMappings.groovy,增加对WebService的处理,修改后内容如下:

"/$controller/$action?/$id?"{

             constraints {

               controller(matches:/.*[^(services)].*/)

                }

         }

黑体部分为修改内容。

 

3.         grailsservice添加一个接口,因为Xfire展现WebService时需要用到接口。在grailsservice中实现这个接口。接口以java方式定义,源文件位于src/java目录下。代码如下:

接口定义:

AsnService.java

package com.easipass.wms;

 

import javax.jws.WebService;

import javax.jws.WebMethod;

@WebService(serviceName="GasnService")

public interface AsnService {

       @WebMethod(operationName = "getName", action = "urn:GetName")

       String getName(String no) ;

       @WebMethod()

       Asn[] show();

}

 

接口定义了两个方法,并用jws注解方式标注接口展现为WebService的名字在@WebService serviceName中定义,jwsWebService的注解定义位于xfire-jsr181-api-1.0-M1.jar中。

show()方法返回一个Asn数组,Asn的定义如下:

Asn.java

package  com.easipass.wms;

import java.io.Serializable;

import java.util.Date;

public class  Asn implements Serializable {

    String asnNo;

    String sender;

    Date    sendDate ;

    public Asn() {

        super();

    }

    public Asn(String asnNo, String sender, Date sendDate) {

        super();

        this.asnNo = asnNo;

        this.sender = sender;

        this.sendDate = sendDate;

    }

    public String getAsnNo() {

        return asnNo;

    }

    public void setAsnNo(String asnNo) {

        this.asnNo = asnNo;

    }

    public Date getSendDate() {

        return sendDate;

    }

    public void setSendDate(Date sendDate) {

        this.sendDate = sendDate;

    }

    public String getSender() {

        return sender;

    }

    public void setSender(String sender) {

        this.sender = sender;

    }  

   

}

 

 

Grails中实现AsnServiceservice的定义如下:

GasnService.groovy

import com.easipass.wms.AsnService

import com.easipass.wms.Asn

import javax.jws.WebService

import java.util.Date

 

@WebService(endpointInterface="com.easipass.wms.AsnService")

class GasnService implements AsnService{

 

    boolean transactional = false

 

      

    String getName(String no) {

           return "Asn_${no}"

    }

   

    Asn[] show() {

           Asn[] aa = new Asn[2];

           aa[0] = new Asn("12345","Int",new Date())

           aa[1] = new Asn("abcd","df",new Date())

           println "size=${aa.size()}  ${aa[0].asnNo}"

           return aa

    }

}

 

4.         grails-app/conf/spring 下的resources.xml中添加对xfire注解的支持bean,内容如下:

 

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

<beans xmlns="http://www.springframework.org/schema/beans"   

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

       xsi:schemaLocation="  

       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">  

      

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

      

       <bean id="jsr181HandlerMapping" class="org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping">

              <property name="xfire" ref="xfire"></property>

              <property name="webAnnotations" ref="webAnnotations"></property>

             

       </bean>

 

</beans>

 

5.         启动系统:grails run-app,在浏览器中输入http://localhost:8080/${appname}/services/ GasnService?wsdl可以得到展现为WebServiceGasnServiceWSDL。有了WSDL就可用各种客户端生成工具来生成WebService的访问程序。appname为grails创建的项目名。