用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创建的项目名。