grails框架配置webService

近期在项目中使用到了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

你可能感兴趣的:(grails框架配置webService)