webservice cxf与spring详解
发布时间:2020-12-16 22:31:16 所属栏目:安全 来源:网络整理
导读:wsdl文档结构图 JDK方式开发 server端代码 package?server;import?javax.jws.WebMethod;import?javax.jws.WebService;/**?*??*??*?SEI:Service?Endpoint?Interface?发布的服务接口?*?*/@WebServicepublic?interface?HelloWS?{@WebMethod????public?String?sa
wsdl文档结构图
server端代码 package?server; import?javax.jws.WebMethod; import?javax.jws.WebService; /** ?*? ?*? ?*?SEI:Service?Endpoint?Interface?发布的服务接口 ?* ?*/ @WebService public?interface?HelloWS?{ @WebMethod ????public?String?sayHello(String?name); } package?server; import?javax.jws.WebService; /** ?*? ?*? ?*?SEI的实现 ?* ?*/ @WebService public?class??HelloWSImpl??implements?HelloWS{ ????@Override ????public?String?sayHello(String?name)?{ ????????System.out.println("server?sayHello()"+name); ????????return?"Hello"+name; ????} } package?server; import?javax.xml.ws.Endpoint; public?class?ServerPublish?{ ???? ????public?static?void?main(String[]?args)?{ ???????? ????????String?address="http://localhost:8090/sayhello"; ????????//对应的wsdl文档地址http://localhost:8090/sayhello?wsdl ????????Endpoint.publish(address,?new?HelloWSImpl()); ????????System.out.println("发布服务成功"); ????} } 根据wsdl文件生成客户端代码 远程 wsimport?-keep? .net代码写的需要修改里面的 <s:sequence> ????<s:element?ref="s:schema"/> ????<s:any/> </s:sequence> 为 ??<s:sequence> ????<s:any?minOccurs="2"?maxOccurs="2"?/> ??</s:sequence> ? 本地 wsimport?-keep??WeatherWS.wsdl 使用以下代码发送请求 package?weather; import?java.util.List; import?cn.com.webxml.ArrayOfString; import?cn.com.webxml.WeatherWS; import?cn.com.webxml.WeatherWSSoap; public?class?ClientTest?{ ????public?static?void?main(String[]?args)?{ ???????? ????????WeatherWS?weatherWS??=new?WeatherWS(); ???????? ????????WeatherWSSoap??weatherWSSoap?=weatherWS.getWeatherWSSoap(); ????????ArrayOfString??arrayOfString=?weatherWSSoap.getWeather("上海",?null); ????????List<String>?list=arrayOfString.getString(); ????????System.out.println(list); ????????for(String?s:list){ ???????????? ????????????System.out.println(s+"***"); ????????} ???????? ????} } 2.CXF方式 CXF支持map,jdk自带不支持map数据结构 使用wsdl2java +wsdl文件地址? 生成客户端调用代码 cxf3.1.4添加日志服务器和客户端拦截器 服务器 package?server; import?java.util.List; import?org.apache.cxf.frontend.ServerFactoryBean; import?org.apache.cxf.interceptor.Interceptor; import?org.apache.cxf.interceptor.LoggingInInterceptor; import?org.apache.cxf.interceptor.LoggingOutInterceptor; import?org.apache.cxf.message.Message; public?class?ServerPublish?{ ???? ????public?static?void?main(String[]?args)?{ ???????? ????????String?address="http://localhost:8090/sayhello"; ????????HelloWSImpl?hw?=?new?HelloWSImpl(); ????????ServerFactoryBean?sfb?=?new?ServerFactoryBean(); ????????sfb.setServiceClass(HelloWS.class); ????????sfb.setServiceBean(hw); ????????sfb.setAddress(address); ????????//服务器端的日志入拦截器 ????????List<Interceptor<??extends?Message>>?inInterceptors?=sfb.getInInterceptors(); ????????inInterceptors.add(new?LoggingInInterceptor()?); ???????? ??????//服务器端的日志出拦截器 ????????List<Interceptor<??extends?Message>>?outInterceptors?=sfb.getOutInterceptors(); ????????outInterceptors.add(new?LoggingOutInterceptor()); ????????sfb.create(); ????????System.out.println("发布服务成功"); ????} } 客户端 package?client; import?java.util.List; import?org.apache.cxf.endpoint.Client; import?org.apache.cxf.frontend.ClientProxy; import?org.apache.cxf.interceptor.Interceptor; import?org.apache.cxf.interceptor.LoggingInInterceptor; import?org.apache.cxf.interceptor.LoggingOutInterceptor; import?org.apache.cxf.message.Message; import?server.HelloWS; import?server.HelloWSPortType; public?class?client_test?{ ????public?static?void?main(String[]?args)?{ ????????HelloWS?helloWS?=?new?HelloWS(); ????????HelloWSPortType?helloWSPortType?=?helloWS.getHelloWSPort(); ????????Client?client=ClientProxy.getClient(helloWSPortType); ?????????//客户端的日志入拦截器 ????????List<Interceptor<??extends?Message>>?inInterceptors?=client.getInInterceptors(); ????????inInterceptors.add(new?LoggingInInterceptor()?); ???????? ??????//客户端的日志出拦截器 ????????List<Interceptor<??extends?Message>>?outInterceptors?=client.getOutInterceptors(); ????????outInterceptors.add(new?LoggingOutInterceptor()); ???????? ????????String?s=helloWSPortType.sayHello("?yuanhai"); ???????? ????????System.out.println(s); ????} } cxf添加自定义拦截器实现密码用户名验证 客户端拦截器 package?client; import?java.util.List; import?javax.xml.namespace.QName; import?org.apache.cxf.binding.soap.SoapMessage; import?org.apache.cxf.headers.Header; import?org.apache.cxf.helpers.DOMUtils; import?org.apache.cxf.interceptor.Fault; import?org.apache.cxf.phase.AbstractPhaseInterceptor; import?org.apache.cxf.phase.Phase; import?org.w3c.dom.Document; import?org.w3c.dom.Element; public?class?AddUserInterceptor??extends?AbstractPhaseInterceptor<SoapMessage>{ ???? ????private?String?name; ????private?String?password; ????public?AddUserInterceptor(String?name,?String?password)?{ ????????super(Phase.PRE_PROTOCOL);//准备协议化时拦截 ????????this.name=name; ????????this.password=password; ???????? ???? ????} ???? ????/* ?????在soap中加个head ?????<Envelope> ?????<head> ?????????<atguigu> ?????????????<name>yuanhai</name> ?????????????<password>123456<password> ?????????</atguigu> ?????????<atguigu2> ?????????????<name>yuanhai</name> ?????????????<password>123456<password> ?????????</atguigu2> ?????</head> ?????<Body> ?????????<sayHello> ?????????????<arg0>yuanhai</arg0> ?????????</sayHello> ?????</Body> ????? ?????</Envelope> ????? ????? ?????*/ ????@Override ????public?void?handleMessage(SoapMessage?msg)?throws?Fault?{ ????List<Header>?headers=????msg.getHeaders(); ???? ????Document?document=DOMUtils.createDocument(); ????????Element?rootEle=document.createElement("atguigu"); ????????Element?nameEle=document.createElement("name"); ????????nameEle.setTextContent(name); ????????Element?passwordEle=document.createElement("password"); ????????passwordEle.setTextContent(password); ????????rootEle.appendChild(nameEle); ????????rootEle.appendChild(passwordEle); ???????? ????????headers.add(new?Header(new?QName("atguigu"),?rootEle));//QName必须跟rootEle的标签一样 ????????System.out.println("client?handleMessage()..."); ????} ???? ???? } 调用代码 package?client; import?java.util.List; import?org.apache.cxf.endpoint.Client; import?org.apache.cxf.frontend.ClientProxy; import?org.apache.cxf.interceptor.Interceptor; import?org.apache.cxf.interceptor.LoggingInInterceptor; import?org.apache.cxf.interceptor.LoggingOutInterceptor; import?org.apache.cxf.message.Message; import?server.HelloWS; import?server.HelloWSPortType; public?class?client_test?{ ????public?static?void?main(String[]?args)?{ ????????HelloWS?helloWS?=?new?HelloWS(); ????????HelloWSPortType?helloWSPortType?=?helloWS.getHelloWSPort(); ???????? ????????Client?client=ClientProxy.getClient(helloWSPortType); ?????????//客户端的日志入拦截器 ????????List<Interceptor<??extends?Message>>?inInterceptors?=client.getInInterceptors(); ????????inInterceptors.add(new?LoggingInInterceptor()?); ???????? ??????//客户端的日志出拦截器 ????????List<Interceptor<??extends?Message>>?outInterceptors?=client.getOutInterceptors(); ????????outInterceptors.add(new?LoggingOutInterceptor()); ????????outInterceptors.add(new?AddUserInterceptor("yuanhai","123456")); ????????String?s=helloWSPortType.sayHello("?yuanhai"); ???????? ????????System.out.println(s); ????} } 服务端拦截器 package?server; import?javax.xml.namespace.QName; import?org.apache.cxf.binding.soap.SoapMessage; import?org.apache.cxf.headers.Header; import?org.apache.cxf.interceptor.Fault; import?org.apache.cxf.phase.AbstractPhaseInterceptor; import?org.apache.cxf.phase.Phase; import?org.w3c.dom.Element; /* ?*?检查用户的拦截器 ?*/ public?class?CheckUserInterceptor?extends?AbstractPhaseInterceptor<SoapMessage>?{ ????public?CheckUserInterceptor()?{ ????????super(Phase.PRE_PROTOCOL); ???? ????} ????@Override ????public?void?handleMessage(SoapMessage?msg)?throws?Fault?{ ???????? ????Header?header=????msg.getHeader(new?QName("atguigu")); ????????if(header!=null){ ????????????Element?atguiguEle?=(Element)?header.getObject(); ???????????? ????????????String?name=atguiguEle.getElementsByTagName("name").item(0).getTextContent(); ????????????String?password=atguiguEle.getElementsByTagName("password").item(0).getTextContent(); ????????????if("yuanhai".equals(name)&&"123456".equals(password)){ ???????????????? ????????????????System.out.println("Server?通过拦截器..."); ????????????????return; ????????????} ???????????? ????????} ????????//不能通过 ????????System.out.println("Server?未通过拦截器..."); ????????throw?new?Fault(new?RuntimeException("请求需要一个正确的用户名和密码")); ???????? ????} } 调用代码 package?server; import?java.util.List; import?org.apache.cxf.frontend.ServerFactoryBean; import?org.apache.cxf.interceptor.Interceptor; import?org.apache.cxf.interceptor.LoggingInInterceptor; import?org.apache.cxf.interceptor.LoggingOutInterceptor; import?org.apache.cxf.message.Message; public?class?ServerPublish?{ ???? ????public?static?void?main(String[]?args)?{ ???????? ????????String?address="http://localhost:8090/sayhello"; ????????HelloWSImpl?hw?=?new?HelloWSImpl(); ????????ServerFactoryBean?sfb?=?new?ServerFactoryBean(); ????????sfb.setServiceClass(HelloWS.class); ????????sfb.setServiceBean(hw); ????????sfb.setAddress(address); ????????//服务器端的日志入拦截器 ????????List<Interceptor<??extends?Message>>?inInterceptors?=sfb.getInInterceptors(); ????????inInterceptors.add(new?LoggingInInterceptor()?); ????????inInterceptors.add(new?CheckUserInterceptor()); ??????//服务器端的日志出拦截器 ????????List<Interceptor<??extends?Message>>?outInterceptors?=sfb.getOutInterceptors(); ????????outInterceptors.add(new?LoggingOutInterceptor()); ????????sfb.create(); ????????System.out.println("发布服务成功"); ????} } 3.cxf与spring集成 server段代码 实体类order package?bean; public?class?Order?{ ???? ????public?Order(int?id,?String?name,?double?price)?{ ???? ????????this.id?=?id; ????????this.name?=?name; ????????this.price?=?price; ????} ????private?int?id; ????private?String?name; ???? ????private?double?price; ???? ????public?int?getId()?{ ????????return?id; ????} ????public?void?setId(int?id)?{ ????????this.id?=?id; ????} ????public?String?getName()?{ ????????return?name; ????} ????public?void?setName(String?name)?{ ????????this.name?=?name; ????} ????public?double?getPrice()?{ ????????return?price; ????} ????public?void?setPrice(double?price)?{ ????????this.price?=?price; ????} ???? } webservice接口 package?ws; import?javax.jws.WebMethod; import?javax.jws.WebService; import?bean.Order; @WebService public?interface?OrderWS?{ ???? ????@WebMethod ????public?Order?getOrderById(int?id); } webservice实现类 package?ws; import?bean.Order; public?class?OrderWsImpl??implements?OrderWS?{ ???? ????public?OrderWsImpl(){ ????????System.out.println("OrderWsImpl()"); ????} ????@Override ????public?Order?getOrderById(int?id)?{ ???????? ????????System.out.println("server?getOrderById()"+id); ????????return?new?Order(id,?"飞机",?100000); ????} } spring配置文件beans.xml <?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns="http://www.springframework.org/schema/beans" ????xmlns:jaxws="http://cxf.apache.org/jaxws"? ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ????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"> ???????? ????????<!--??引入cxf的一些核心配置--> ????<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="orderWS"?implementor="ws.OrderWsImpl"?address="/orderws"?> ???? ????<jaxws:inInterceptors> ????<bean?class="ws.CheckUserInterceptor"/> ????</jaxws:inInterceptors> ?????</jaxws:endpoint> ???? </beans> web.xml <?xml?version="1.0"?encoding="UTF-8"?> <web-app?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?? ????????xmlns:web="http://java.sun.com/xml/ns/javaee"? ????????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"?version="2.5"> ??<context-param> ????<param-name>contextConfigLocation</param-name> ????<param-value>classpath*:beans.xml</param-value> ??</context-param> ??<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>/*</url-pattern> ??</servlet-mapping> </web-app> 客户端 spring配置文件client-beans.xml <?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns="http://www.springframework.org/schema/beans" ????xmlns:jaxws="http://cxf.apache.org/jaxws"? ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ????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"> ???????? ???? ????<jaxws:client?id="orderClient"? ????serviceClass="ws.OrderWS"? ????address="http://localhost:8080/webservice_cxf_spring_server/orderws"> ???? ????<jaxws:outInterceptors> ????<bean?class="test.AddUserInterceptor"> ????<constructor-arg?name="name"?value="yuanhai"/> ????<constructor-arg?name="password"?value="123456"/> ????</bean> ????</jaxws:outInterceptors> ???? ?????</jaxws:client> ???? </beans> 客户端调用代码 package?test; import?org.springframework.context.support.ClassPathXmlApplicationContext; import?ws.Order; import?ws.OrderWS; public?class?client_test?{ ????public?static?void?main(String[]?args)?{ ????????ClassPathXmlApplicationContext?context?=?new?ClassPathXmlApplicationContext( ????????????????new?String[]?{?"client-beans.xml"?}); ????????OrderWS?orderWs?=?(OrderWS)?context.getBean("orderClient"); ????????Order?order?=?orderWs.getOrderById(24); ????????System.out.println(order); ????} } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |