您的位置:首页 > 其它

webservice服务端发布与调用 JAX-WS cxf axis2

2017-07-14 15:16 302 查看

之前项目中需要用到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:在控制台显示输出信息

wsimport -keep -s D: -p com.client http://localhost:456/helloWord?wsdl
就会在D盘的com文件夹下的client文件夹下生成客户端
然后自己移到工作空间就好了。
这里注意的是:上面命令行中标红的地方 -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;

@WebService
public interface DemoTest2 {
@WebMethod
public String sayHello(@WebParam(name="param")String param);
}


实现类:
package com.test;

public class DemoTest2Impl implements DemoTest2 {

@Override
public 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

客户端调用按照第一种方式用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
4000
/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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  webservice cxf axis