用Xfire框架可以用很简易的方法将POJO展现为WebService ,而且Xfire还提供和spring的集成,可以很方便的将spring的bean展现为WebService。Grails的service在运行时会被srping托管,成为一个bean,因此可以用Xfire将其展现为WebService。将grails的service展现为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中添加xfire的servlet处理器,由于grails的web.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.???????? 为grails的service添加一个接口,因为Xfire展现WebService时需要用到接口。在grails的service中实现这个接口。接口以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中定义,jws对WebService的注解定义位于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中实现AsnService的service的定义如下:
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可以得到展现为WebService的GasnService的WSDL。有了WSDL就可用各种客户端生成工具来生成WebService的访问程序。appname为grails创建的项目名。