spring 整合 cxf
程序员文章站
2022-07-12 18:37:55
...
1 spring 整合 cxf 服务端
所以jar可以从cxf的lib下面添加所有
首先web.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <!-- 加载Spring容器配置 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 设置Spring容器加载配置文件路径 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/spring-*.xml</param-value> </context-param> <!-- web service --> <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> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
配置spring和cxf
2 创建对应的service类
先声明接口:
package com.malone.service; import javax.jws.WebService; /** * @author Claus * 本类为web端为android客户端提供的接口 */ //@WebService(name = "IAndroidService", targetNamespace = "http://publish.smc.webservice.mr.android/") @WebService public interface IAndroidService { /** * wanzan 2013-07-15 添加此方法 * 在自动线巡功能中获取服务器端时间,用来校正客户端时间 * @param requestJson * @return */ public String getServerTime(String requestJson); }
声明实现类:
package com.malone.serviceImpl; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import javax.jws.WebService; import com.malone.service.IAndroidService; /** * 为android客户端提供的接口服务端。 * * @author Claus */ //@WebService(name = "AndroidService", targetNamespace = "http://publish.smc.webservice.mr.android/", endpointInterface = "com.malone.service.IAndroidService") @WebService public class AndroidService implements IAndroidService { private static DateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); @Override public String getServerTime(String requestJson) { return dateFormat.format(new Date()); } }
在spring的配置文件中定义service的bean
<?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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="androidService" class="com.malone.serviceImpl.AndroidService"/> </beans>
在配置文件中发布webservice:
<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-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <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" /> <jaxws:endpoint id="wsAndroidService1" implementor="#androidService" address="/android"> <jaxws:inInterceptors> <bean class="com.malone.filter.AndroidServiceLoggingInterceptor"/> </jaxws:inInterceptors> </jaxws:endpoint> </beans>
把web项目添加到tomcat中运行,访问:http://localhost:8080/应用名/ws/android?wsdl;/ws是在web.xml中配置的,/android是在spring_cxf中配置的
2 客户端代码:
(1)首先用wsdl命令生成客户端代码:
根据wsdl生成客户端代码的命令
wsdl2java用法:
wsdl2java -p com -d src -all aa.wsdl
wsdl2java -d src - client http://localhost:9000/helloWorld?wsdl
-p 指定其wsdl的命名空间,也就是要生成代码的包名:
-d 指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web service的代码
-impl 生成web service的实现代码
-ant 生成build.xml文件
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
(1.1) 根据http://localhost:8080/webserviceDemo/ws/android?wsdl 可以看到wsdl文档,保存成xml格式,我保存到F盘跟目录,在cxf的bin目录下,使用wsdl2java命令生成客户端代码:
wsdl2java -p com.malone.client -d F:workspace\webserviceClient\src -all F:\android.xml
此命令会在路径F:workspace\webserviceClient\src(即webserviceClient项目的源码路径)生成对应的代码
网上很多教程上,客户端测试都是使用服务端的Service类,在此使用(以及下面两中方式)都是使用上面的命令生成的客户端的IAndroidService接口及对应的实现类,生成代码为:
package com.malone.client; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.ws.RequestWrapper; import javax.xml.ws.ResponseWrapper; /** * This class was generated by Apache CXF 2.7.11 * 2014-05-09T14:46:36.919+08:00 * Generated source version: 2.7.11 * */ @WebService(targetNamespace = "http://service.malone.com/", name = "IAndroidService") @XmlSeeAlso({ObjectFactory.class}) public interface IAndroidService { @WebResult(name = "return", targetNamespace = "") @RequestWrapper(localName = "getServerTime", targetNamespace = "http://service.malone.com/", className = "com.malone.client.GetServerTime") @WebMethod @ResponseWrapper(localName = "getServerTimeResponse", targetNamespace = "http://service.malone.com/", className = "com.malone.client.GetServerTimeResponse") public java.lang.String getServerTime( @WebParam(name = "arg0", targetNamespace = "") java.lang.String arg0 ); }
/** * Please modify this class to meet your needs * This class is not complete */ package com.malone.client; import java.util.logging.Logger; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.ws.RequestWrapper; import javax.xml.ws.ResponseWrapper; /** * This class was generated by Apache CXF 2.7.11 * 2014-05-09T14:46:36.908+08:00 * Generated source version: 2.7.11 * */ @javax.jws.WebService( serviceName = "AndroidServiceService", portName = "AndroidServicePort", targetNamespace = "http://serviceImpl.malone.com/", wsdlLocation = "file:/F:/android.xml", endpointInterface = "com.malone.client.IAndroidService") public class IAndroidServiceImpl implements IAndroidService { private static final Logger LOG = Logger.getLogger(IAndroidServiceImpl.class.getName()); /* (non-Javadoc) * @see com.malone.client.IAndroidService#getServerTime(java.lang.String arg0 )* */ public java.lang.String getServerTime(java.lang.String arg0) { LOG.info("Executing operation getServerTime"); System.out.println(arg0); try { java.lang.String _return = ""; return _return; } catch (java.lang.Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } } }
(2)客户端可以使用spring进行整合
从新开启一个web项目,添加spring整合cxf 客户端的配置:
<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-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <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" /> <jaxws:client id="androidService" serviceClass="com.malone.client.IAndroidService" address="http://localhost:8080/webserviceDemo/ws/android"/> </beans>在代码中调用方法:
package com.malone.client.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import com.malone.client.IAndroidService; public class SpringClientTest { public static void main(String[] args) { ApplicationContext ctx = new FileSystemXmlApplicationContext("WebRoot/WEB-INF/spring/spring-cxf.xml"); IAndroidService androidService = (IAndroidService)ctx.getBean("androidService"); System.out.println(androidService.getServerTime(null)); } }
(3)使用JaxWsProxyFactoryBean调用
示例代码:
package com.malone.client.test; import java.text.ParseException; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import com.malone.client.IAndroidService; public class SoapClient { public static void main(String[] args) throws ParseException { JaxWsProxyFactoryBean soapFactoryBean = new JaxWsProxyFactoryBean(); soapFactoryBean .setAddress("http://localhost:8080/webserviceDemo/ws/android"); soapFactoryBean.setServiceClass(IAndroidService.class); Object o = soapFactoryBean.create(); IAndroidService iAndroidService = (IAndroidService) o; System.out.println(iAndroidService.getServerTime(null)); } }
推荐阅读
-
Spring源码分析——调试环境搭建(可能是最省事的构建方法)
-
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
-
python整合ffmpeg实现视频文件的批量转换
-
【spring-boot 源码解析】spring-boot 依赖管理梳理图
-
Springboot源码分析之Spring循环依赖揭秘
-
Spring boot 入门(一):快速搭建Spring boot项目
-
Spring的并发问题——有状态Bean和无状态Bean
-
只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常
-
使用spring拦截器手写权限认证框架
-
SparkStreaming整合Flume的pull方式之启动报错解决方案