代码改变世界

基于CXF框架下的SOAP Webservice服务端接口开发

2018-12-18 23:43  GarfieldEr007  阅读(569)  评论(0编辑  收藏  举报

最近对webservice 进行入门学习,网上也是找了很多的学习资料。总得感觉就是这了解点,那了解点。感觉不够系统,不够容易入门。差不多断断续续看了一个星期了,今天小有成果,把客户端,服务端都搞定了。我先写服务端,在说客户端。

框架:服务端webservice是spring+cxf的maven工程。
环境:jdk1.7+maven3.3.9+tomcat7
新建maven工程可以参考我之前的博客:使用eclips创建Maven项目。

1.引入开发的依赖。pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhanglf</groupId>
<artifactId>springCXFWebserviceDemo01</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>springCXFWebserviceDemo01 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- 添加 Spring dependency -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>

<!-- 添加CXF 依赖 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.5</version>
</dependency>
<!-- 添加CXF 依赖 -->
</dependencies>
<build>
<finalName>cxfService</finalName>
</build>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
2.添加spring整合cxf的配置文件。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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<!-- spring自动扫包 -->
<context:component-scan base-package="com.zlf" />

<!-- 导入jar包中的cxf配置文件。这里不用写,是写好的放在jar包里,直接引入即可。 -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<!-- define web service provider -->
<!-- 要暴露给外部调用的接口,address:请求路径 -->
<jaxws:endpoint implementor="com.zlf.impl.HelloWorldImpl" address="/HelloWorldService" />
</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
为了更清晰,我把我的maven工程的结构截出来供参考。

HelloWorld.java是我开放给外部webservice接口,HelloWorldImpl.java是它的实现类。XMLUtil.java是工具类。下面会有具体代码。

3.在web.xml中引入cxf前置拦截器配置。
<?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>springCXFWebserviceDemo01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<!-- Spring config-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>

<!-- Spring listener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
</web-app>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
4.前三步基本把框架搭建好了。下面开始webservice服务端代码开发。
a.新建一个接口:HelloWorld.java

package com.zlf;

import javax.jws.WebParam;
import javax.jws.WebService;

/**
* @1.这里的@Webservice(targetNamespace="")的作用类似与spring的Controller层中的Controller("/helloworld"),用于定位
* 你请求的时那个接口,用于区分接口。
* @2.在客户端有指定用哪个接口中的哪个方法的具体设置代码:
* call.setOperationName(new QName("serviceTargetName", "sayHello"));
* 方法中的QName方法的入参说明:
* new QName(
* String namespaceURI-定位接口的命名空间:接口注解targetnamespace的值或者wsdl文件<wsdl:definitions中的xmlns:tns="com.serviceTargetName"来锁定targetnamespace的值,
* 这里如果不是用Axis2框架开发的webservice接口,最好不用wsdl文件<wsdl:definitions中的targetNamespace来确定值的原因在于这里的值来源与接口实现类上的targetNamespace注解的值。如果你接口的实现类中的targetNamespace和接口的不一样,岂不是搞错了。
* String localPart-接口下定位方法的方法名:就是这里的抽象方法sayHello方法名,或者wsdl文件<wsdl:binding标签下<wsdl:operation name="sayHello"中name的值。
* )
* @3.在要发布的服务接口类开头加上@WebService 在接口的实现类开头也加上@WebService 若两个类不在同一个包中
* 则还要在实现类上用targetNamespace指明目标命名空间。命名空间的值和接口上的值一样。
*
* @author Administrator
*
*
*/
@WebService(targetNamespace = "com.serviceTargetName")
public interface HelloWorld {
//如果接口没有用@WebParam(name = "parameterName")来指明方法入参的参数名称-这里时'parameterName',则在客户端你传入参数时:
//客户端设置入参:call.addParameter("parameterName", XMLType.XSD_STRING, ParameterMode.IN);
//会报错:Unmarshalling Error: 意外的元素 (uri:"", local:"parameterName")。所需元素为<{}arg0>
public String sayHello(@WebParam(name = "parameterName") String name);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
b.实现类HelloWorldImpl.java

package com.zlf.impl;

import javax.jws.WebService;

import org.springframework.stereotype.Component;

import com.zlf.HelloWorld;
/**
* 由于实现类和接口不在同一个包中。所以要加上targetNamespace属性。
* 另外,这里的endpointInterface是实现类对应接口的全路径
* @author Administrator
*/
@WebService(targetNamespace="com.serviceTargetName",endpointInterface="com.zlf.HelloWorld")
@Component("HelloWord")//spring注入用
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHello(String str) {

return "你好,"+str+" 你已成功访问了webservice服务端!" ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
然后启动项目。访问http://localhost:8080/springCXFWebserviceDemo01/service/HelloWorldService?wsdl。这里注意一个问题-有些网上好像也能用去掉?wsdl的地址http://localhost:8080/springCXFWebserviceDemo01/service/HelloWorldService访问,但这里是不行的,在网页上直接访问是get请求,直接访问不带?wsdl的会出错。所以带上?wsdl访问就行了。页面如下:

访问的地址解析:
部署并启动服务,访问wsdl,本配置访问如下:
http://localhost:8001/webserviceTest/services/testService?wsdl
我的项目部署在本地,端口8080,应用访问名称为webserviceTest,web.xml中cxf拦截配置为/services/*,applicationContext.xml发布相对地址address为/HelloWorldService.
1
2
3
4
页面如下:


到这里webservice服务端就开发成功了~下一次进行客户端开发,我用了两种框架cxf,axis分别来访问webservice接口。
---------------------
作者:万米高空
来源:CSDN
原文:https://blog.csdn.net/zhanglf02/article/details/73927914
版权声明:本文为博主原创文章,转载请附上博文链接!