近期在项目中使用到了grails的webservice发布,总结如下:
一、axis2的配置
1、安装axis2插件
命令:install-plugin axis2
2、服务类的使用
新建一个service,然后在服务类中加入下面一句就ok了
static expose=['axis2']
3、测试一下
输入地址:http://localhost:8080/gidms_sd/axis2-web
如出现axis2的欢迎界面即为成功。
二、客户端调用
写好一个方法,按理说可以调用了。
例如:http://localhost:8080/gidms_sd/services/transfer/sayHello?word=HelloWorld
但实际上会出现如下报错信息:
Please enable REST support in WEB-INF/conf/axis2.xml and WEB-INF/web.xml
之前折腾了好几个小时,网上搜索的内容没有正确的,都说要修改配置文件等等。
实际上这是一个很简单的错误,grails配置的axis2插件应该是有些问题的,不能直接使用地址调用,需要使用客户端代码调用才可以。代码如下:
try {
// 调用webservice传递数据,部分参数固化
RPCAxis rpcaxis = new RPCAxis();
String srvcUrl ="http://127.0.0.1:8080/gidms_sd/services/transfer";
String namespace = "http://item.gidms.product.lhcis.com";
//方法名
String operation = "sayHello";
//参数值
String info = "HelloWorld";
String result = rpcaxis.RPC4Axis2WithReturn(srvcUrl, namespace, operation, info);
return result;
} catch (Exception e) {
e.printStackTrace();
return "exception";
}
rpcaxis类中的RPC4Axis2WithReturn方法如下:
public String RPC4Axis2WithReturn(String srvcUrl, String namespace,
String operation, String value) throws AxisFault {
// 操作的命名空间+操作名
QName qname = new QName(namespace, operation); // namespace与wsdl中的targetNamespace对应"
// 传递的参数对象集
Object param[] = new Object[] { value };
// 实例化远程服务调用客户端对象
RPCServiceClient client = new RPCServiceClient();
// 实例化Options对象
Options options = new Options();
// 设置Options对象的连接终端地址
options.setTo(new EndpointReference(srvcUrl));
// 设置Options对象的操作事件对象
options.setAction(operation);
//为了解决大访问量超时问题
options.setTimeOutInMilliSeconds(600000L);
// 为远程服务调用客户端对象设置Options子对象
client.setOptions(options);
// 传递参数,调用服务,获得返回值
Object[] result = client.invokeBlocking(qname, param,new Class[] { String.class });
// 清除
client.cleanupTransport();
return result[0].toString();
}
以上的方法只适合传递一个参数,如果需要传递多个参数,可以在info中进行拼接,然后在service中进行字符串的分割。
开发的过程中遇到一个报错:qname not fond for the package
查了一下,才发现是返回值的类型问题,经查发现AXIS2不支持集合,而axis1反倒支持,axis2需要用对象数组的方式来处理。
打包成war后解压缩,启动tomcat,客户端调用时报:
org.apache.axis2.AxisFault: SOAP message MUST NOT contain a Document Type Declaration(DTD)
经查为webservice发布错误:
org.apache.axis2.AxisFault: The system is attempting to engage a module that is not available: addressing
解决方法:
这个问题是由于缺少一个文件引起的,这个文件叫:addressing-1.41.mar
在插件的lib文件夹中可以找到这个文件,将它放在war包的lib包中,重新启动tomcat就可以正常访问
文件可在C:\Users\lenovo\.grails\2.1.0\projects\gidms_sd\plugins\axis2-0.7.0\lib中找到
在打包过程中报一个错误:
[copy] Warning: C:\Users\Lenovo.grails\1.3.5\projects\utm-ncm\plugins\axis2-0.6.1\lib not found
导致这个问题的原因是,插件中一个指定打包地址填写错误。修改插件中一个文件
C:\Users\当前用户名.grails\1.3.5\projects\utm-ncm\plugins\axis2-0.7.0\scripts_Events.groovy
用记事本或其他文本编辑啊工具打开,将文件里0.6.1改为0.7.0,重新打包就可以。
原文
eventWarStart = { msg ->
Ant.copy(todir:"${grailsSettings.projectWorkDir}/staging/WEB-INF/lib", flatten:true, failonerror:false) {
fileset(dir:"${grailsSettings.projectPluginsDir}/axis2-0.6.1/lib") {
include(name:"*.mar")
}
}
}
修改后:
eventWarStart = { msg ->
Ant.copy(todir:"${grailsSettings.projectWorkDir}/staging/WEB-INF/lib", flatten:true, failonerror:false) {
fileset(dir:"${grailsSettings.projectPluginsDir}/axis2-0.7.0/lib") {
include(name:"*.mar")
}
}
}
参考资料:
http://ligson.iteye.com/blog/1174261
http://www.myexception.cn/software-architecture-design/430743.html
http://buxin-2008.iteye.com/blog/1302986