用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创建的项目名。
这里使用了jsr181注解来展现WebService,在要展现的