Spring 集成CXF框架发布Webservice服务 和 使用jdk生成Webservice clinet
2016-06-16 13:10
986 查看
一、发布Webservice服务
# 依赖 jar
commons-logging-1.1.1.jar
asm-3.3.1.jar
cxf-2.7.5.jar
//httpasyncclient-4.0-beta3.jar
httpclient-4.2.1.jar
httpcore-4.2.2.jar
//httpcore-nio-4.2.2.jar
neethi-3.0.2.jar
org.springframework.aop-3.1.3.RELEASE.jar
org.springframework.asm-3.1.3.RELEASE.jar
org.springframework.beans-3.1.3.RELEASE.jar
org.springframework.context-3.1.3.RELEASE.jar
org.springframework.core-3.1.3.RELEASE.jar
org.springframework.expression-3.1.3.RELEASE.jar
org.springframework.web-3.1.3.RELEASE.jar
org.springframework.web.servlet-3.1.3.RELEASE.jar
stax2-api-3.1.1.jar
woodstox-core-asl-4.2.0.jar
wsdl4j-1.6.3.jar
//wss4j-1.6.10.jar
xmlschema-core-2.0.3.jar
//xmlsec-1.5.4.jar
# download url
http://cxf.apache.org/download.html
http://www.springsource.org/download/community
#配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 默认首页定义 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!--一般配置了DispatcherServlet就不需要配置ContextLoaderListener
CXF的核心控制器要依赖Spring的ContextLoaderListner配置方式,如果配置了CXFServlet,要使用ContextLoaderListener 方式才能生效
而SpringMVC用的是DiapacherServlet的配置方式
为了防止容器重复加载bean, 拆分配置文件:
applicationContext-hibernate-dao.xml,applicationContext-mvc.xml(DiapacherServlet配置方式)中配置普通的bean和Controller组件
applicationContext-webservice.xml(ContextLoaderListner配置方式)中配置CXF。
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext-webservice.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.ac</url-pattern>
</servlet-mapping>
<!--CXF核心控制器-->
<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>/ws/*</url-pattern>
</servlet-mapping>
</web-app>
#编写一个提供服务的接口
#接口的实现类
#编写spring 配置文件 applicationContext-webservice.xml
#浏览器访问wsdl 网址为 域名+CXFServlet 映射的路径+ spring配置文件中 <jaxws:endpoint> 元素配置的address属性值+?wsdl
C:\Program Files\Java\jdk1.6.0_39\bin>wsimport -keep -p zhong.webservice.clinet -s e:\
http://localhost:8080/ws/userWebService?wsdl
-s(src):在当前路径下的e盘文件夹中生成客户端代码
-p(package):定义客户端代码的包名
-keep 保留.class文件
#生成的文件目录为
#编写一个测试类来调用生成的一堆代码
# 依赖 jar
commons-logging-1.1.1.jar
asm-3.3.1.jar
cxf-2.7.5.jar
//httpasyncclient-4.0-beta3.jar
httpclient-4.2.1.jar
httpcore-4.2.2.jar
//httpcore-nio-4.2.2.jar
neethi-3.0.2.jar
org.springframework.aop-3.1.3.RELEASE.jar
org.springframework.asm-3.1.3.RELEASE.jar
org.springframework.beans-3.1.3.RELEASE.jar
org.springframework.context-3.1.3.RELEASE.jar
org.springframework.core-3.1.3.RELEASE.jar
org.springframework.expression-3.1.3.RELEASE.jar
org.springframework.web-3.1.3.RELEASE.jar
org.springframework.web.servlet-3.1.3.RELEASE.jar
stax2-api-3.1.1.jar
woodstox-core-asl-4.2.0.jar
wsdl4j-1.6.3.jar
//wss4j-1.6.10.jar
xmlschema-core-2.0.3.jar
//xmlsec-1.5.4.jar
# download url
http://cxf.apache.org/download.html
http://www.springsource.org/download/community
#配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 默认首页定义 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!--一般配置了DispatcherServlet就不需要配置ContextLoaderListener
CXF的核心控制器要依赖Spring的ContextLoaderListner配置方式,如果配置了CXFServlet,要使用ContextLoaderListener 方式才能生效
而SpringMVC用的是DiapacherServlet的配置方式
为了防止容器重复加载bean, 拆分配置文件:
applicationContext-hibernate-dao.xml,applicationContext-mvc.xml(DiapacherServlet配置方式)中配置普通的bean和Controller组件
applicationContext-webservice.xml(ContextLoaderListner配置方式)中配置CXF。
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext-webservice.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.ac</url-pattern>
</servlet-mapping>
<!--CXF核心控制器-->
<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>/ws/*</url-pattern>
</servlet-mapping>
</web-app>
#编写一个提供服务的接口
/** * @WebService 必须,(name="UserService")可选,配置Service的名称,默认为类名。targetNamespace(如果不写,wsdl上面就不会生成接口上面配置的@WebResult类型)可选,默认为http:// package的倒序, @WebResult 可选,配置方法的返回值在WSDL的名称,CXF默认为return。 @WebParam 可选,配置参数在WSDL的名称,CX比较笨,不会反射,默认为arg0,arg1.... @WebMethod 可选,默认接口的所有方法均输出为WebService。 有一个方法有此注释,则其他无注释的方法非WebService。 */ @WebService(targetNamespace = "www.zhong.webservice.demo") public interface UserWebService { @WebMethod(operationName = "getUserByUserId") @WebResult(name ="User") public User getUser(@WebParam(name = "userId") Integer userId); @WebMethod() public void createUser(@WebParam(name = "name")String name,@WebParam(name = "age")Integer age); }
#接口的实现类
/** *@WebService(endpointInterface="") 可选,指定实现的接口。接口是对外的,必须通过注释来声明,而Impl是内部的,声明是可选的。 */ @WebService(serviceName="UserWebService",endpointInterface = "webservice.demo.UserWebService",targetNamespace = "www.zhong.webservice.demo") public class UserWebServiceImpl implements UserWebService{ private UserService userService; public void setUserService(UserService userService) { //用于spirng注入bean this.userService = userService; } public User getUser(Integer userId) { return userService.getUser(userId); } public void createUser(String name, Integer age) { userService.createUser(name,age); } }
#编写spring 配置文件 applicationContext-webservice.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-2.5.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd" default-autowire="byName" default-lazy-init="false"> <import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <bean id="userService" class="webservice.demo.UserService"></bean> <bean id="userWebServiceImpl" class="webservice.demo.UserWebServiceImpl"> <!--<property name="userService" ref="userService"></property> 开启了autowire 自动装配,可以不用显式声明--> </bean> <jaxws:endpoint implementor="#userWebServiceImpl" address="/userWebService"></jaxws:endpoint> <!--<jaxws:endpoint id="UserWebService" implementor="webservice.demo.UserWebServiceImpl" address="/userWebService"/>--> </beans>
#浏览器访问wsdl 网址为 域名+CXFServlet 映射的路径+ spring配置文件中 <jaxws:endpoint> 元素配置的address属性值+?wsdl
二、使用JDK1.6的wsimport.exe产生客户端代码
#命令行窗口输入 (如果配置了java path,可以在任意路径下输入此命令,否则要到jdk/bin 目录下)C:\Program Files\Java\jdk1.6.0_39\bin>wsimport -keep -p zhong.webservice.clinet -s e:\
http://localhost:8080/ws/userWebService?wsdl
-s(src):在当前路径下的e盘文件夹中生成客户端代码
-p(package):定义客户端代码的包名
-keep 保留.class文件
#生成的文件目录为
#编写一个测试类来调用生成的一堆代码
public class InvokTest { public static void main(String[] agrs){ UserWebService userWebService = new UserWebService_Service().getUserWebServiceImplPort(); User user = userWebService.getUserByUserId(1); System.out.println(user); } }
相关文章推荐
- Unable to read entire header; 336 bytes read; expected 512 bytes
- SpringMVC中使用ajax请求controller后无法执行success回调函数
- eclipse插件开发——环境问题解决
- 转:利用JAXB进行xml和javabean之间转换
- Java乱码问题,解决Java乱码
- Eclipse开发Android程序在手机上运行
- java的4个核心技术
- JAVA输入/输出流程序例题(文件和目录、字节流、字符流)
- jad反编译class类文件的时候容易出错的几种情况
- 全面解读Java NIO工作原理(一)
- Java内部类的作用
- Java, SSH 框架
- Struts2基础知识
- dbsetup实现数据准备和清理工作
- 一天一句小贴士:早日告别试用期
- 给从C转向JAVA的第一个Java程序例子
- 如何修改myeclipse的内存?
- spring学习之@SessionAttributes
- Java学习基础篇(-)类和对象
- JAVA必杀技-超越模式的泛型