其实webService的发布不仅仅只有xfire,今天,给大家介绍一下用CXF发布一个webService的小demo,CXF也是我做webService用的第一个框架。。。
先将相关的jar引进来,在pom文件中添加
<dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-transports-http</artifactId>
      <version>2.7.3</version>
  </dependency>
  
  <dependency>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-rt-frontend-jaxws</artifactId>
   <version>2.7.3</version>
  </dependency>
即可引入相关的
第一步,不废话,还是写一个简单的接口与实现类,代码如下
public interface SayCXFService {
public  String sayHello(String name);
}
public class SayCXFServiceImpl implements SayCXFService{
@Override
public String sayHello(String name) {
  return name +" hello,this is my first CXF webService!";
}
}
接下来就是重点了,配置文件了,配置文件如下。相应的解释也有
<?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-3.0.xsd
                        http://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd"
default-lazy-init="true"
>
  <!-- cxf 相关配置,这个照搬就行了,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" />

<!-- service定义 -->
<bean id="sayCXFbean"
  class="com.mip.biz.webservice.cxf.server.service.impl.SayCXFServiceImpl"
  scope="singleton"
/>
<!--
serviceClass 表示你要对外开发的接口,address表示的地址,本质就是一个servletName,可以随便命名
   -->
<jaxws:server id="webService" serviceClass="com.mip.biz.webservice.cxf.server.service.SayCXFService" address="/server">
     <!-- 表示你的接口实现类的bean -->
  <jaxws:serviceBean>
   <ref bean="sayCXFbean"/>
  </jaxws:serviceBean>
</jaxws:server>
</beans>

然后是web.xml文件添加如下内容
<servlet>
  <description>apache cxf 配置 webservice 服务</description>
  <servlet-name>CXFService</servlet-name>
  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>CXFService</servlet-name>
  <url-pattern>/CXFService/*</url-pattern>
</servlet-mapping>
除了测试类,似乎和前段时间的xfire没啥区别,试一下启动tomcat,会发现抱NullPointerException吧
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webService': Invocation of init method failed; nested exception is java.lang.NullPointerException
别急,你只需要在接口上稍微改动一下即可

//注解的方式,将接口注入,targetNamespace中的内容其实就是将包名写反就行了。。这也是我们平时包名的命名规则类似。com开头,然后模块名称..有么像www.ho123.com?
@WebService(targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/")
public interface SayCXFService {
public  String sayHello(String name);
}
//实现类
@WebService(endpointInterface="com.mip.biz.webservice.cxf.server.service.SayCXFService",
  targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/")
public class SayCXFServiceImpl implements SayCXFService{
@Override
public String sayHello(String name) {
  return name +" hello,this is my first CXF webService!";
}
}
好了重启不会报错了
然后在浏览器中输入http://localhost:8080/mip/CXFService/server?wsdl出现祖国江山一片红的景象就ok了
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://service.server.cxf.webservice.biz.mip.com/" elementFormDefault="unqualified" targetNamespace="http://service.server.cxf.webservice.biz.mip.com/" version="1.0">
<xs:element name="sayHello" type="tns:sayHello" />

<xs:element name="sayHelloResponse" type="tns:sayHelloResponse" />

- <xs:complexType name="sayHello">
+ <xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string" />

</xs:sequence>

</xs:complexType>

- 。。。。。。
注意到上面的红色标记部分没,其实我们可以将参数的名字显示出来,改下接口
@WebService(targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/")
public interface SayCXFService {
@WebMethod
@WebResult
//下面的name="wsdl中暴露出来的接口参数名称"
public  String sayHello(@WebParam(name="name",targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/") String name);
}
重新看下wsdl文件:

- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://service.server.cxf.webservice.biz.mip.com/" elementFormDefault="unqualified" targetNamespace="http://service.server.cxf.webservice.biz.mip.com/" version="1.0">
<xs:element name="sayHello" type="tns:sayHello" />

<xs:element name="sayHelloResponse" type="tns:sayHelloResponse" />

- <xs:complexType name="sayHello">
- <xs:sequence>
<xs:element form="qualified" minOccurs="0" name="name" type="xs:string" />

</xs:sequence>

</xs:complexType>

-

以上是用java开发的服务端,下一章我们接着写客户端与测试类
@WebService(targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/")
public interface SayCXFClient {
public  String sayHello(String name); }
客户端其实直接将服务端拷贝过来就可以了。。。。当然这是在java开发的服务端基础上你才可以做,假如你的webservice服务端是其他语言开发的,,,那么可以用其他方法生成客户端咯,主要依据的是wsdl文件。。这个我在下一篇博客给大家介绍。。。请期待
最后在写个测试类
public class Test {
public static void main(String[] args) {
  JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
  factory.setServiceClass(SayCXFClient.class);
  factory.setAddress("http://localhost:8080/mip/CXFService/server");
  SayCXFClient service = (SayCXFClient) factory.create();
       System.out.println(service.sayHello("zhouxy"));
}
}
运行输出
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: unexpected element (uri:"", local:"arg0"). Expected elements are <{http://service.server.cxf.webservice.biz.mip.com/}name>
这个是由于我们在服务端明确指出了参数名name照成的,别担心,改下就行了
@WebService(
targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/")
public interface SayCXFClient {
@WebMethod
@WebResult
//下面的name="wsdl中暴露出来的接口参数名称"
public  String sayHello(@WebParam(name="name",targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/") String name);
}
继续运行输出:
zhouxy hello,this is my first CXF webService!
ok,demo结束,更详细的理论知识自己查资料去吧

[置顶] 利用CXF发布webService的小demo的更多相关文章

  1. CXF发布webService服务以及客户端调用

    这篇随笔内容是CXF发布webService服务以及客户端调用的方法 CXF是什么? 开发工作之前需要下载CXF和安装 下载地址:http://cxf.apache.org 安装过程: <1&g ...

  2. SpringBoot整合cxf发布webService

    1. 看看项目结构图 2. cxf的pom依赖 1 <dependency>2 <groupId>org.apache.cxf</groupId>3 <art ...

  3. SpringMVC4整合CXF发布WebService

    SpringMVC4整合CXF发布WebService版本:SpringMVC 4.1.6,CXF 3.1.0项目管理:apache-maven-3.3.3 pom.xml <project x ...

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

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

  5. 使用CXF发布WebService服务简单实例

    一.说明: 前面介绍了使用axis2来发布Webservice服务,现在介绍一种更popular,更高效的Webservice服务发布技术:CXF Apache CXF = Celtix + XFir ...

  6. 使用CXF发布WebService

    这里普及一下WebService和cxf的知识.关于webservice和cxf:   WebService.各种提供服务的组件     .企业总线.通讯总线(ESB)CXF:是一个SOA框架,Axi ...

  7. CXF发布webservice入门

    1.设置CXF的bin目录进环境变量 2.CXF导入相关的jar包. 3.建立接口 @WebService public interface HelloWorld { public void say( ...

  8. cxf发布 webservice服务

    导包 antlr-2.7.7.jar aopalliance-1.0.jar asm-3.3.jar commons-collections-3.2.1.jar commons-lang-2.6.ja ...

  9. 使用CXF发布webservice服务及注意要点

    一.概念 1.什么是webservice Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用 ...

随机推荐

  1. javascript (六) 引用外部js文件

    外部的 JavaScript 也可以把脚本保存到外部文件中.外部文件通常包含被多个网页使用的代码. 外部 JavaScript 文件的文件扩展名是 .js. 如需使用外部文件,请在 <scrip ...

  2. 如何利用Win32API取得另一支程式中的ListView內的所有值(RegisterHotKey,ReadProcessMemory,WindowFromPoint和VirtualAllocEx)

    http://blog.csdn.net/shuaihj/article/details/6129506

  3. 一个网友写的栈,问为啥不能迭代。具有__iter__ 和next方法的对象叫迭代器-七七巴巴黄页网

    一个网友写的栈,问为啥不能迭代.具有__iter__ 和next方法的对象叫迭代器-七七巴巴黄页网 一个网友写的栈,问为啥不能迭代.具有__iter__ 和next方法的对象叫迭代器 python视频 ...

  4. sql,nosql

    1. 关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库. 关系模型是在1970年由IBM的研究员E.F.Codd博士首先提出的,在之后的几十年中,关系模型的概念得到了充分的发展并逐渐成 ...

  5. Doxgen+Graphiz+htmlhelp配置

    查看一些开源码常常被一些函数的调用关系给绕进去.找个工具生成个调用关系图或简单的文档对于帮助阅读程序有非常大的帮助. 1 doxgen+graphviz+htmlhelp简单介绍 1.1 doxgen ...

  6. zoj2314(有上下界的网络流)

    传送门:Reactor Cooling 题意:给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流 ...

  7. loj1236(数学)

    传送门:Pairs Forming LCM 题意:题意:问符合 lcm(i,j)=n (1<=i<=j<=n,1<=n<=10^14) 的 (i,j) 有多少对. 分析: ...

  8. C语言文件操作之fgets()

        来说一说fgets(..)函数.     原型  char *  fgets(char * s, int n,FILE *stream);     參数:          s: 字符型指针, ...

  9. 内存级别/栅栏 ( Memory Barriers / Fences ) – 翻译

    翻译自:Martin Thompson – Memory Barriers/Fences 在这篇文章里,我将讨论并发编程里最基础的技术–以内存关卡或栅栏著称.那让进程内的内存状态对其它进程可见. CP ...

  10. 风起看云涌,叶落品人生 - Google 搜索

    风起看云涌,叶落品人生 - Google 搜索 风起看云涌,叶落品人生