前言

自3月份到一家快递公司之后,就极少有时间来写博客了,进去的第一个周末就加班。做公司的开放平台,协助一个小伙伴写WebService接口,用的就是CXF。正好这个东西曾经使用过。如今快7月了,曾经写的东西。还木有写完,今天继续。将曾经未写完的东西。写完整。

准备工作

这次的例子,都是在曾经的基础上写的。主要贴出基本的代码。服务端和client都与Spring集成。使用了拦截器、Map数据类型等

服务端

共计写了四个服务。第一个主要说明服务端有多种公布方式,第二和第三实现类是同样的。差别在于第三个有拦截器,第四个包含拦截器和Map的数据类型,这些配置文件的凝视中也有。

配置文件内容例如以下:
  1. <?
  2.  
  3. xml version="1.0" encoding="UTF-8"?
  4.  
  5. >
  6. <beans xmlns="http://www.springframework.org/schema/beans"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xmlns:jaxws="http://cxf.apache.org/jaxws"
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans
  10. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  11. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  12.  
  13. <import resource="classpath:META-INF/cxf/cxf.xml"/>
  14. <!-- <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> -->
  15.  
  16. <!-- 服务一。无client -->
  17. <!-- 多种公布方式都能够
  18. <bean id="noInterfaceServiceImpl"
  19. class="com.wds.cxf.spring.server.impl.NoInterfaceServiceImpl"/>
  20. <jaxws:endpoint address="/noInterfaceService"
  21. implementor="#noInterfaceServiceImpl"
  22. ></jaxws:endpoint>
  23. -->
  24. <jaxws:endpoint
  25. id="noInterfaceService" address="/noInterfaceService"
  26. implementor="com.wds.cxf.spring.server.impl.NoInterfaceServiceImpl"
  27. ></jaxws:endpoint>
  28.  
  29. <!-- 服务2:有client,不带拦截器 -->
  30. <jaxws:server address="/userService2">
  31. <jaxws:serviceBean>
  32. <bean class="com.wds.cxf.spring.server.impl.UserServiceImpl"></bean>
  33. </jaxws:serviceBean>
  34. </jaxws:server>
  35.  
  36. <!-- 服务3:有client。带拦截器 。与服务2是同样的代码。差别之处就是这个服务有拦截器-->
  37. <jaxws:server address="/userService" serviceClass="com.wds.cxf.spring.server.IUserService">
  38. <jaxws:serviceBean>
  39. <bean class="com.wds.cxf.spring.server.impl.UserServiceImpl"></bean>
  40. </jaxws:serviceBean>
  41. <jaxws:inInterceptors>
  42. <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
  43. <bean class="com.wds.cxf.spring.server.interceptor.HeaderHandlerInterceptor"></bean>
  44. </jaxws:inInterceptors>
  45.  
  46. <jaxws:outInterceptors>
  47. <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
  48. </jaxws:outInterceptors>
  49. </jaxws:server>
  50.  
  51. <!-- 服务4:有拦截器,Map类型的数据结构 -->
  52. <jaxws:server address="/SecurityService" serviceClass="com.wds.cxf.spring.server.ISecurityService">
  53. <jaxws:serviceBean>
  54. <bean class="com.wds.cxf.spring.server.impl.SecurityServiceImpl"></bean>
  55. </jaxws:serviceBean>
  56. <jaxws:inInterceptors>
  57. <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
  58. <bean class="com.wds.cxf.spring.server.interceptor.HeaderHandlerInterceptor"></bean>
  59. </jaxws:inInterceptors>
  60. <jaxws:outInterceptors>
  61. <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
  62. </jaxws:outInterceptors>
  63. </jaxws:server>
  64. </beans>

第一个服务的类:

  1. package com.wds.cxf.spring.server.impl;
  2.  
  3. import javax.jws.WebService;
  4.  
  5. @WebService
  6. public class NoInterfaceServiceImpl {
  7.  
  8. public String test(){
  9. return "Hello, this is test method";
  10. }
  11. }

第二个和第三个服务的接口及实现类

  1. package com.wds.cxf.spring.server;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.jws.WebService;
  6.  
  7. @WebService
  8. public interface IUserService {
  9. public List<String> getUserName();
  10. }
  11.  
  12. 实现类
  13. package com.wds.cxf.spring.server.impl;
  14.  
  15. import java.util.ArrayList;
  16. import java.util.List;
  17.  
  18. import javax.jws.WebService;
  19. import javax.xml.ws.BindingType;
  20. import javax.xml.ws.soap.SOAPBinding;
  21.  
  22. import com.wds.cxf.spring.server.IUserService;
  23.  
  24. @WebService(endpointInterface="com.wds.cxf.spring.server.IUserService",serviceName="UserService")
  25. @BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
  26. public class UserServiceImpl implements IUserService {
  27.  
  28. @Override
  29. public List<String> getUserName() {
  30. List<String> userNameList = new ArrayList<String>();
  31.  
  32. String userName = "firstName";
  33. userNameList.add(userName);
  34. userName = "secondName";
  35. userNameList.add(userName);
  36. userName = "thirdName";
  37. userNameList.add(userName);
  38.  
  39. return userNameList;
  40. }
  41.  
  42. }

第四个服务

  1. package com.wds.cxf.spring.server;
  2.  
  3. import java.util.List;
  4. import java.util.Map;
  5.  
  6. import javax.jws.WebService;
  7. import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
  8.  
  9. import com.wds.cxf.spring.server.adapter.MappingUser;
  10.  
  11. @WebService
  12. public interface ISecurityService {
  13. @XmlJavaTypeAdapter(value=MappingUser.class)
  14. public Map<String, List<User>> getAuthority();
  15. }
  16.  
  17. 实现类
  18. package com.wds.cxf.spring.server.impl;
  19.  
  20. import java.util.ArrayList;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Map;
  24.  
  25. import com.wds.cxf.spring.server.ISecurityService;
  26. import com.wds.cxf.spring.server.User;
  27.  
  28. public class SecurityServiceImpl implements ISecurityService {
  29.  
  30. @Override
  31. public Map<String, List<User>> getAuthority() {
  32. Map<String, List<User>> result = new HashMap<String, List<User>>();
  33. User u = null;
  34. List<User> users = new ArrayList<User>(10);
  35. String key = "seriail1";
  36. for (int i = 0; i < 10; i++) {
  37. u = new User("name" + i, "code--" + i);
  38. users.add(u);
  39. }
  40. result.put(key, users);
  41.  
  42. users = new ArrayList<User>(10);
  43. key = "seriail2";
  44. for (int i = 20; i < 30; i++) {
  45. u = new User("name" + i, "code--" + i);
  46. users.add(u);
  47. }
  48. result.put(key, users);
  49.  
  50. return result;
  51. }
  52.  
  53. }

类型转换的适配类两个

  1. package com.wds.cxf.spring.server.adapter;
  2.  
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Map.Entry;
  7.  
  8. import javax.xml.bind.annotation.adapters.XmlAdapter;
  9.  
  10. import com.wds.cxf.spring.server.User;
  11.  
  12. public class MappingUser extends XmlAdapter<MappingUserValue, Map<String, List<User>>>{
  13.  
  14. @Override
  15. public Map<String, List<User>> unmarshal(MappingUserValue src)
  16. throws Exception {
  17. Map<String, List<User>> target = new HashMap<String, List<User>>();
  18. for (MappingUserValue.Entry entry : src.getEntries()) {
  19. target.put(entry.getKey(), entry.getValue());
  20. }
  21. return target;
  22. }
  23.  
  24. @Override
  25. public MappingUserValue marshal(Map<String, List<User>> src) throws Exception {
  26. MappingUserValue result = new MappingUserValue();
  27. MappingUserValue.Entry e = null;
  28. for (Entry<String, List<User>> entry : src.entrySet()) {
  29. e = new MappingUserValue.Entry();
  30. e.setKey(entry.getKey());
  31. e.setValue(entry.getValue());
  32. result.getEntries().add(e);
  33. }
  34. return result;
  35. }
  36.  
  37. }


  1. package com.wds.cxf.spring.server.adapter;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import com.wds.cxf.spring.server.User;
  7.  
  8. public class MappingUserValue {
  9. private List<Entry> entries = new ArrayList<MappingUserValue.Entry>();
  10.  
  11. public List<Entry> getEntries() {
  12. return entries;
  13. }
  14.  
  15. public void setEntries(List<Entry> entries) {
  16. this.entries = entries;
  17. }
  18.  
  19. public static class Entry {
  20. private String key;
  21. private List<User> value;
  22.  
  23. public List<User> getValue() {
  24. return value;
  25. }
  26.  
  27. public void setValue(List<User> value) {
  28. this.value = value;
  29. }
  30.  
  31. public String getKey() {
  32. return key;
  33. }
  34.  
  35. public void setKey(String key) {
  36. this.key = key;
  37. }
  38.  
  39. }
  40.  
  41. }

拦截器

  1. package com.wds.cxf.spring.server.interceptor;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.xml.namespace.QName;
  6.  
  7. import org.apache.cxf.binding.soap.SoapMessage;
  8. import org.apache.cxf.headers.Header;
  9. import org.apache.cxf.interceptor.Fault;
  10. import org.apache.cxf.message.Message;
  11. import org.apache.cxf.phase.AbstractPhaseInterceptor;
  12. import org.apache.cxf.phase.Phase;
  13. import org.w3c.dom.Element;
  14. import org.w3c.dom.NodeList;
  15.  
  16. public class HeaderHandlerInterceptor extends AbstractPhaseInterceptor<Message> {
  17.  
  18. public HeaderHandlerInterceptor(String phase) {
  19. super(Phase.PRE_INVOKE);
  20. }
  21.  
  22. public HeaderHandlerInterceptor() {
  23. this(null);
  24. }
  25.  
  26. @Override
  27. public void handleMessage(Message message) throws Fault {
  28. SoapMessage msg = (SoapMessage)message;
  29. List<Header> headers = msg.getHeaders();
  30.  
  31. if(headers == null || headers.size() < 1){
  32. throw new Fault(new IllegalArgumentException("There have no header node!"));
  33. }
  34.  
  35. Header firstHeader = headers.get(0);
  36.  
  37. for (Header header : headers) {
  38. QName qName = header.getName();
  39. System.out.println(qName);
  40. }
  41.  
  42. Element element = (Element)firstHeader.getObject();
  43.  
  44. NodeList usernameNode = element.getElementsByTagName("username");
  45. NodeList passwordNode = element.getElementsByTagName("password");
  46.  
  47. if(usernameNode == null || usernameNode.getLength() != 1){
  48. throw new Fault(new IllegalArgumentException("not valid username"));
  49. }
  50.  
  51. if(passwordNode == null || passwordNode.getLength() != 1){
  52. throw new Fault(new IllegalArgumentException("not valid password"));
  53. }
  54.  
  55. String userName = usernameNode.item(0).getTextContent();
  56. String userPass = passwordNode.item(0).getTextContent();
  57.  
  58. if(!("admin".equals(userPass) && "admin".equals(userName))){
  59. throw new Fault(new IllegalArgumentException("username or password is not valid"));
  60. }
  61. }
  62.  
  63. }

至此,服务端的代码。所有齐了

client

client的代码是须要CXF的命令生成
  1. <?
  2.  
  3. xml version="1.0" encoding="UTF-8"?>
  4. <beans xmlns="http://www.springframework.org/schema/beans"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xmlns:jaxws="http://cxf.apache.org/jaxws"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  9. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  10.  
  11. <import resource="classpath:META-INF/cxf/cxf.xml"/>
  12. <!-- 第四个服务的客户端 -->
  13. <jaxws:client
  14. id="securityService"
  15. address="http://localhost:8080/web/services/SecurityService"
  16. serviceClass="com.wds.java.cxf.client.role.code.ISecurityService" >
  17. <jaxws:outInterceptors>
  18. <bean class="com.wds.java.cxf.interceptor.ClientHeaderInterceptor">
  19. <constructor-arg index="0" value="admin" />
  20. <constructor-arg index="1" value="admin" />
  21. </bean>
  22. <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
  23. </jaxws:outInterceptors>
  24. <jaxws:inInterceptors>
  25. <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
  26. </jaxws:inInterceptors>
  27. </jaxws:client>
  28.  
  29. <!-- 第三个服务的客户端 -->
  30. <jaxws:client
  31. id="userServiceOne"
  32. address="http://localhost:8080/web/services/userService"
  33. serviceClass="com.wds.java.cxf.client.user.code.IUserService" >
  34. <jaxws:outInterceptors>
  35. <bean class="com.wds.java.cxf.interceptor.ClientHeaderInterceptor">
  36. <constructor-arg index="0" value="admin" />
  37. <constructor-arg index="1" value="admin" />
  38. </bean>
  39. </jaxws:outInterceptors>
  40. </jaxws:client>
  41.  
  42. <!-- 第二个服务的客户端 -->
  43. <jaxws:client
  44. id="userServiceTwo"
  45. address="http://localhost:8080/web/services/userService2"
  46. serviceClass="com.wds.java.cxf.client.user.code.IUserService" />
  47.  
  48. </beans>

使用CXF的命令。生成客户端代码,加上面的配置。此外还须要一个拦截器,代码例如以下:

  1. package com.wds.java.cxf.interceptor;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.xml.namespace.QName;
  6.  
  7. import org.apache.cxf.binding.soap.SoapMessage;
  8. import org.apache.cxf.headers.Header;
  9. import org.apache.cxf.helpers.DOMUtils;
  10. import org.apache.cxf.interceptor.Fault;
  11. import org.apache.cxf.phase.AbstractPhaseInterceptor;
  12. import org.apache.cxf.phase.Phase;
  13. import org.w3c.dom.Document;
  14. import org.w3c.dom.Element;
  15.  
  16. public class ClientHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage>{
  17.  
  18. private String username;
  19. private String password;
  20.  
  21. public ClientHeaderInterceptor(String phase) {
  22. super(Phase.PREPARE_SEND);//在准备发送SOAP消息时,调用此拦截器
  23. }
  24.  
  25. public ClientHeaderInterceptor(String username, String password) {
  26. this("");
  27. this.username = username;
  28. this.password = password;
  29. }
  30.  
  31. @Override
  32. public void handleMessage(SoapMessage msg) throws Fault {
  33. List<Header> headers = msg.getHeaders();
  34. Document doc = DOMUtils.createDocument();
  35. Element authEle = doc.createElement("header");
  36. Element usernameEle = doc.createElement("username");
  37. Element passwordEle = doc.createElement("password");
  38.  
  39. usernameEle.setTextContent(username);
  40. passwordEle.setTextContent(password);
  41.  
  42. authEle.appendChild(usernameEle);
  43.  
  44. authEle.appendChild(passwordEle);
  45.  
  46. Header header = new Header(new QName("authHeaer"), authEle);
  47.  
  48. headers.add(header);
  49.  
  50. authEle = doc.createElement("headerTwo");
  51. usernameEle = doc.createElement("username");
  52. passwordEle = doc.createElement("password");
  53.  
  54. usernameEle.setTextContent(username);
  55. passwordEle.setTextContent(password);
  56.  
  57. authEle.appendChild(usernameEle);
  58.  
  59. authEle.appendChild(passwordEle);
  60.  
  61. header = new Header(new QName("2authHeaer"), authEle);
  62.  
  63. headers.add(header);
  64. }
  65.  
  66. }

測试类

  1. package com.wds.java.cxf.client.user;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. import com.wds.java.cxf.client.role.code.Entry;
  8. import com.wds.java.cxf.client.role.code.ISecurityService;
  9. import com.wds.java.cxf.client.role.code.MappingUserValue;
  10. import com.wds.java.cxf.client.user.code.IUserService;
  11.  
  12. public class Main {
  13.  
  14. @SuppressWarnings("resource")
  15. public static void main(String[] args) {
  16. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:/conf/cxf/spring-cxf-client.xml");
  17.  
  18. IUserService service = (IUserService) context.getBean("userServiceTwo");
  19. List<String> userNames = service.getUserName();
  20.  
  21. service = (IUserService) context.getBean("userServiceOne");
  22. List<String> userNamesOne = service.getUserName();
  23.  
  24. for (String string : userNames) {
  25. System.out.println(string);
  26. }
  27.  
  28. for (String string : userNamesOne) {
  29. System.out.println(string);
  30. }
  31.  
  32. ISecurityService securityService = (ISecurityService) context.getBean("securityService");
  33. MappingUserValue userValue = securityService.getAuthority();
  34. List<Entry> entries = userValue.getEntries();
  35. for (Entry entry : entries) {
  36. System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());
  37. }
  38. }
  39.  
  40. }

执行就可以







WebService-06-CXF与Spring集成的更多相关文章

  1. 使用CXF与Spring集成实现RESTFul WebService

    以下引用与网络中!!!     一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存 ...

  2. 使用Apache CXF和Spring集成创建Web Service(zz)

    使用Apache CXF和Spring集成创建Web Service 您的评价:       还行  收藏该经验       1.创建HelloWorld 接口类 查看源码 打印? 1 package ...

  3. 【WebService】WebService之CXF和Spring整合(六)

    前面介绍了WebService与CXF的使用,项目中我们经常用到Spring,这里介绍CXF与Spring整合 步骤 1.创建一个Maven Web项目,可以参照:[Maven]Eclipse 使用M ...

  4. 【WebService】——CXF整合Spring

    相关博客: [WebService]--入门实例 [WebService]--SOAP.WSDL和UDDI 前言: 之前的几篇博客基本上都是使用jdk来实现WebService的调用,没有使用任何框架 ...

  5. webservice的cxf和spring整合发布

    1.新建一个web项目 2.导入cxf相应的jar包,并部署到项目中 3.服务接口 package com.xiaostudy; /** * @desc 服务器接口 * @author xiaostu ...

  6. webservice的cxf和spring整合客户端开发

    1.新建一个java项目 2.导入cxf相关的jar包,并部署到项目中 3.用命令生成客户端使用说明文档 wsdl2java -p com.xiaostudy -d . http://127.0.0. ...

  7. WebService学习之三:spring+cxf整合

    步骤一:spring项目(java web项目)引入CXF jar包 步骤二:创建webservice服务器 1)创建一个服务接口 package com.buss.app.login; import ...

  8. CXF框架介绍及Spring集成

    1.CXF框架概念介绍 Apache CXF 是一个开源的 WebService 框架,CXF可以用来构建和开发 WebService,这些服务可以支持多种协议,比如:SOAP.POST/HTTP.H ...

  9. webservice第三篇【接口开发webservice、CXF框架使用、IDEA下使用webservice、小例子】

    实现接口的webservice 服务端 import javax.jws.WebService; /**面向接口的webservice发布方式 * * */ @WebService public in ...

  10. Spring集成CXF发布WebService并在客户端调用

    Spring集成CXF发布WebService 1.导入jar包 因为官方下载的包里面有其他版本的sprring包,全导入会产生版本冲突,所以去掉spring的部分,然后在项目根目录下新建了一个CXF ...

随机推荐

  1. relatedTarget, fromElement, toElement

    原文:http://www.quirksmode.org/js/events_mouse.html#relatedtarget W3C在mouseover和mouseout事件中添加了relatedT ...

  2. docker 容器扩盘

    docker:/root/sbin# cat add_fs.sh #!/bin/bash #This script is dynamic modify docker container disk #A ...

  3. uva10934 Dropping water balloons

    //好久没做题 一直没状态 然后刷了个水题玩玩 //寒假集训和校赛都做到了类似的题目 然而当时并不会 (其实现在也不会 题意:有k个气球和一个n层高的楼,气球有硬度,在某曾会恰好摔碎,问至少多少次实验 ...

  4. struts 2 三目运算

    <s:set id="styleList" value="{'default','success','warning'}"/> <s:iter ...

  5. shell 变量自增(转)

    原文地址:http://www.cnblogs.com/iloveyoucc/archive/2012/07/11/2585559.html Linux Shell中写循环时,常常要用到变量的自增,现 ...

  6. iOS 的 APP 如何适应 iPhone 5s/6/6Plus 三种屏幕的尺寸?(转)

    原文:http://www.niaogebiji.com/article-4379-1.html?utm_source=tuicool 初代iPhone 2007年,初代iPhone发布,屏幕的宽高是 ...

  7. php汉字截取

    /** * 截取HTML,并自动补全闭合 * @param $html * @param $length * @param $end */ function subHtml($html,$length ...

  8. UIView 属性

    1.alpha 设置视图的透明度.默认为1. ojbc // 完全透明 view.alpha = 0; // 不透明 view.alpha = 1; 2.clipsToBounds 默认是NO,当设置 ...

  9. Android 图片平铺效果实现的3种方法

    Html中平铺的效果,那么我们都是怎么样才能实现的那,我们其实主要用到的就是api,我们一开始new一个bitmap,就可以了,那么我们就来说说第二种方法,那就在用到了xml,上面我们说了两个方法,但 ...

  10. placeholder颜色

    ::-moz-placeholder{color:#b9bfc1;} // Firefox::-webkit-input-placeholder{color:#b9bfc1;} // Chrome, ...