一 Spring整合CXF
Web Services只是一套接口规范,实际运用中实现Web Services的方法有很多种,Java本身在jdk1.7之后也对Web Services有了默认的实现(Oracle JAX-WS RI),但是在我们实际开发中一般还是会使用框架来,比如这里所提到的CXF就有着广泛的应用。
CXF单独发布就不说了,直接讲Spring整合CXF,毕竟现在的JavaEE开发是离不开Spring了。
1.1 maven配置
加入maven依赖
<!--cxf-->
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.6</version>
</dependency>
1.2 配置 web.xml
<!--定义一个cxf的servlet-->
<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>/webservice/*</url-pattern>
</servlet-mapping>
1.3 写一个WS接口及其实现
非常简洁的接口和实现
接口:HelloWorld.java
package com.nowjava.cxf;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
public String say(String str);
}
实现:HelloWorldImpl.java
package com.nowjava.cxf.impl;
import com.nowjava.cxf.HelloWorld;
import org.springframework.stereotype.Component;
import javax.jws.WebService;
@Component("helloWorld")
@WebService
public class HelloWorldImpl implements HelloWorld {
public String say(String str) {
return "Hello"+str;
}
}
1.4 修改Spring配置文件
在spring主配置文件spring.xml中添加引入spring-cxf.xml
<!-- lang: 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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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">
<context:component-scan base-package="com.erictao"/>
<!-- 省略其他配置内容 -->
<import resource="spring-cxf.xml"/>
</beans>
并且创建配置文件spring-cxf.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:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!-- 定义webservice的发布接口 -->
<jaxws:endpoint implementor="#helloWorld" address="/HelloWorld">
</beans>
更加具体的配置可以查看官方给出的文档:http://cxf.apache.org/docs/how-do-i-develop-a-service.html。#helloWorld
指的是我们在HelloWorldImpl类中所自定义的名字,即@Component("helloWorld")
定义的bean id,/HelloWorld
则是我们定义的接口地址。
二 运行发布WS
之后我们运行项目输入该地址:http://127.0.0.1:8080/ssm/webservice/HelloWorld?wsdl如果出现如下界面:
则说明我们的webservice发布成功了。接下来只需要通过客户端调用这个接口即可获得返回结果了。
附:客户端代码生成
客户端的代码可以直接使用工具生成,可参考下面说明:
环境准备
1、JDK环境
2、下载apache-cxf发布包,目前最新版本为3.1.7,解压发布包,设置CXF_HOME,并添加%CXF_HOME %/bin到path环境变量。
3、CMD命令行输入wsdl2java -help,有正常提示说明环境已经正确配置。
命令使用
此命令主要是生成webservice的客户端代码,服务端可以是自行开发的服务,也可以是需要对接的服务接口,最简单的命令如下:
wsdl2java wsdlurl
其中wsdlurl为服务发布的访问地址,未写参数默认生成的是客户端的代码,其中用得最多的是-encoding 参数,是指定Java代码的编码格式,例如:
wsdl2java -encoding wsdlurl
其他详细的参数及说明可以用wsdl2java -help或wsdl2java -h获取,根据实际的需求设置相应的参数即可。
常用接口:IP地址来源搜索 WEB 服务
1、生成客户端代码
WSDL地址:
http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl
使用wsdl2java工具将客户端代码直接生成在eclipse的工程里,eclipse工程地址为:E:\workspace\webservice,命令如下:
wsdl2java -encoding utf-8 -d E:/workspace/webservice/src http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl1
-encoding表示生成的Java文件编码格式为utf8,-d表示代码生成路径为E:/workspace/webservice/src。
执行完毕,没有报任何错误,说明执行成功
可以看到在eclipse下面已经生成了相应的代码:
2、客户端代码调用服务
写一个小demo,调用发布的IP查询服务