webservice服务端发布与调用 JAX-WS cxf axis2
来源:互联网 发布:淘宝直播大v认证 编辑:程序博客网 时间:2024/05/22 10:48
之前项目中需要用到webservice的发布最后做出了几个例子如下:
1 基础 JAX-WS实例
接口发布:
package com.test;import javax.jws.WebMethod;import javax.jws.WebService;import javax.xml.ws.Endpoint;/** * @WebService - 它是一个注解,用在类上指定将此类发布成一个ws. Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。 * */ @WebService(targetNamespace="http://DemoTest/com/")public class DemoTest {@WebMethod(operationName="sayHelloMyName")//修改暴露的方法名public String sayHello(String name){return "hello "+name;}/** *添加exclude=true后,sayBye()方法不会被发布 * @param name * @return */ @WebMethod(exclude=true) public String sayBye(String name){return "bye "+name;}public static void main(String[] args) {Endpoint.publish("http://localhost:456/helloWord",new DemoTest()); System.out.println("webservice start...");//访问http://localhost:456/helloWord?wsdl}}以上这种方法是通过java中自带的包的一种发布方式
运行main方法:
然后通过wsimpost命令生成客户端代码:
wsimpost命令有几个重要的参数:
-keep:是否生成java源文件
-d:指定输出目录
-s:指定源代码输出目录
-p:以package的形式生成文件
-verbose:在控制台显示输出信息
就会在D盘的com文件夹下的client文件夹下生成客户端
然后自己移到工作空间就好了。
这里注意的是:上面命令行中标红的地方 -p com.client其实是在包com中的client包中移到eclipse的时候也要是这个路径 否则需要改生成的客户端的一些代码
这里注意的是:上面命令行中标红的地方 -p com.client其实是在包com中的client包中移到eclipse的时候也要是这个路径 否则需要改生成的客户端的一些代码
测试类的代码如下:
package com.client;public class MainRun {public static void main(String[] args) {DemoTestService dws=new DemoTestService();DemoTest a=dws.getDemoTestPort();String result=a.sayHelloMyName("张三");System.out.println(result);}}
2.cxf webservice 实例
这里只是cxf基于spring 的发布方式其实个人感觉和JAX-WS发布方式差不多
接口:
package com.test;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;@WebServicepublic interface DemoTest2 {@WebMethodpublic String sayHello(@WebParam(name="param")String param);}
实现类:
package com.test;public class DemoTest2Impl implements DemoTest2 {@Overridepublic String sayHello(String param) {return "hello "+param;}}web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>abc</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- cxf服务启动servlet --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/webService/*</url-pattern> </servlet-mapping></web-app>applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:jaxws="http://cxf.apache.org/jaxws"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"><!-- 两种发布方式 --><!-- 第一种 --><jaxws:endpoint id="DemoTest2" implementor="com.test.DemoTest2Impl" address="/DemoTest2" /><!-- 第二种 --><bean id="serviceTest" class="com.test.DemoTest2Impl"></bean><jaxws:server address="/test2" serviceClass="com.test.DemoTest2"><jaxws:serviceBean><ref bean="serviceTest" /></jaxws:serviceBean></jaxws:server></beans>
这是一个接口发布了两次访问地址分别为:
http://localhost:8080/WebServiceDemo2/webService/DemoTest2?wsdl
http://localhost:8080/WebServiceDemo2/webService/test2?wsdl
注意:jar包需要引对
地址拼写为: 地址:端口/项目名/web.xml中的CXFServlet自定义的映射的名字/spring配置中的地址?wsdl
地址拼写为: 地址:端口/项目名/web.xml中的CXFServlet自定义的映射的名字/spring配置中的地址?wsdl
客户端调用按照第一种方式用wsimport生成客户端进行调用
3.axis2 werbservice 实例(我在用axis2发布的时候出现过好多问题,最终虽然解决了但是他的底层还是不太清晰,不足之处请大神指点一二)
axis2发布有多重方式 这里只具体针对一种方式进行举例 如果看其他的方式可以访问http://blog.csdn.net/qq877507054/article/details/61922139
首先在http://axis.apache.org/axis2/java/core/download.cgi下载axis2的war解压缩后将conf、modules和services复制到项目WEB-INF下如下
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>WebServiceDemo</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/webService/*</url-pattern> </servlet-mapping></web-app>
请看上面xml中的这句话<url-pattern>/webService/*</url-pattern> 和cxf的webservice中的web.xml中那句话起的作用一样 是为了拦截webservice的请求。
但是axis2发布webservice的时候他有个文件是axis2.xml 他默认拦截貌似是/services/的 所以如果你web.xml中用的是<url-pattern>/webService/*</url-pattern> 这个的话你需要修改axis2.xml中的一句话<parameter name="servicePath">services</parameter>如果是注释的就放开 改成和web.xml中一样的拦截 改成:<parameter name="servicePath">webService</parameter>
如果两边不一致的话即使wsdl可以访问 客户端调用也会报错
错误是:the service cannot be found for the endpoint reference (EPR) ...
services.xml
<?xml version="1.0" encoding="UTF-8"?><!-- service的name是暴露的服务接口 --><service name="DemoTest3" targetNamespace="http://DemoTest3/com/"><!-- 设置命名空间 --><schema schemaNamespace="http://DemoTest3/com/"/><!-- 类路径 --><parameter name="ServiceClass">com.test.DemoTest3</parameter><!-- 消息接收器 --><messageReceivers><messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /><messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /></messageReceivers></service>
上面service.xml中的标红的两端最好一致
接口类:
package com.test;public class DemoTest3 {public String sayHello(String name){return "hello "+name;}}
访问路径为:http://localhost:8080/WebServiceDemo3/webService/DemoTest3?wsdl
客户端调用:
这次使用rpc的方式调用接口
代码:
package com.test;import javax.xml.namespace.QName;import org.apache.axis2.addressing.EndpointReference;import org.apache.axis2.client.Options;import org.apache.axis2.rpc.client.RPCServiceClient;public class MainRun {public static void main(String[] args) throws Exception { // 使用RPC方式调用WebService RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); // 指定调用WebService的URL EndpointReference targetEPR = new EndpointReference("http://localhost:8080/WebServiceDemo3/webService/DemoTest3?wsdl"); options.setTo(targetEPR); // 指定方法的参数值 String parameter = "张三"; Object[] opArgs = new Object[] { parameter }; // 指定方法返回值的数据类型的Class对象 Class[] opReturnType = new Class[] { String.class }; // 指定要调用的方法及WSDL文件的命名空间 QName opQName = new QName("http://DemoTest3/com/","sayHello"); // 调用方法输出返回值 Object[] result = null; result = serviceClient.invokeBlocking(opQName, opArgs, opReturnType); System.out.println((String)result[0]);}}
调用结果如下:
注意:如果你调用的时候报错:The ServiceClass object does not implement the required method in the following form: OMElement。。。
则需要将你的service.xml中的
http://www.w3.org/2004/08/wsdl/in-out和http://www.w3.org/2004/08/wsdl/in-only
改成
http://www.w3.org/ns/wsdl/in-out和http://www.w3.org/ns/wsdl/in-only 就ok了应该
至于为什么 我在网上搜说是版本问题咋着呢 具体我也没研究。
关于rpc有比我更详细的:http://blog.csdn.net/csh624366188/article/details/8362696
阅读全文
0 0
- webservice服务端发布与调用 JAX-WS cxf axis2
- WebService —— JAX-WS 与 CXF
- Jax WS发布webservice
- JAX-WS WebService发布
- jax-ws详解:与javaee webservice(Axis2)的区别
- 【转载】WebService —— JAX-WS 与 CXF
- webservice中JAX-WS与CXF,Axis区别
- Axis2 与 JAX-WS规范
- 利用jax-ws发布WebService
- jws jax-ws jax-rs jaxb cxf axis2 关系
- jws jax-ws jax-rs jaxb cxf axis2 关系
- 简单的Jax-WS WebService实现-cxf
- 框架 day64 WebService(注解),CXF框架(jax-ws,Jax-rs,与spring整合)
- WebService(注解),CXF框架(jax-ws,Jax-rs,与spring整合)
- webservice框架(cxf, axis2, spring-ws)
- WS (CXF) JAX-WS
- 基于Java的webservice创建与jax-ws方式调用
- 基于CXF的JAX-WS、JAX-RS(RESTful)的webService
- WindowXP与WIN7环境安装、破解、配置AppScan8.0
- 创建Maven项目流程
- python3之循环
- vmware 日常小技巧
- js url 编码解码
- webservice服务端发布与调用 JAX-WS cxf axis2
- 机器学习习题(3)
- 在 Windows 窗体 RichTextBox 控件中显示滚动条
- Android ScrollView滚动到底部问题
- 推荐给IT运维工程师必须学习的4本Linux书籍
- 快速排序
- HDU--2059--龟兔赛跑
- 微信小程序之二 window
- 多线程--第十九天