WebService框架CXF实战(一)

Apache CXF提供了用于方便地构建和开发WebService的可靠基础架构。它允许创建高性能和可扩展的服务,可以部署在Tomcat和基于Spring的轻量级容器中,也可以部署在更高级的服务器上,例如Jboss、WebSphere或WebLogic。

CXF提供了以下功能:

  • WebService服务标准支持:

    • Java API for XML Web Services (JAX-WS)
    • SOAP
    • WebService描述语言(Web Services Description Language ,WSDL)
    • 消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)
    • WS-Basic Profile
    • WS-Addressing
    • WS-Policy
    • WS-ReliableMessaging
    • WS-Security
  • 前端建模:CXF允许使用不同的前端API来创建Service。如CXF允许使用简单的工厂Bean并通过JAX-WS实现来创建WebService,允许创建动态WebService客户端。
  • 工具支持:CXF提供了在Java Bean、WebService和WSDL之间进行转换的工具,提供了对Maven和Ant集成的支持,并无缝地支持Spring集成。
  • RESTful支持:CXF支持Restful,并支持Java平台的JAX-RS实现。
  • 对不同传输和绑定的支持:CXF支持不同数据类型的传输,除了支持SOAP和HTTP协议绑定外,还支持JAXB和AEGIS绑定。
  • 对非XML绑定的支持:CXF支持非XML绑定,如JSON、CORBA、JBI和SCA等。
  • Code First和Xml First:CXF支持使用Code First或者Xml First的方式创建WebService。

下面用CXF创建独立发布的WebService。

服务端

在Eclipse中创建maven项目,配置文件pom.xml中引入CXF,具体配置如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.rvho</groupId>
    <artifactId>cxfstandalone</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <!-- 文件拷贝编码 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 输出编码 -->
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!-- 编译编码 -->
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <!-- CXF版本 -->
        <cxf.version>3.1.1</cxf.version>
    </properties>

    <dependencies>
        <!-- CXF -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <!-- 如果CXF不集成到Web服务器中,必须添加该引用 -->
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <!-- End CXF -->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <!-- 指定source和target的jdk版本是1.8 -->
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

服务接口HelloWS,该接口发布welcome方法。

package com.rvho.cxfstandalone.ws;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(
        name = "HelloWS",
        targetNamespace = "http://www.tmp.com/services/hello"
    )
public interface HelloWS {
    @WebMethod
    String welcome(@WebParam(name = "name") String name);
}

服务接口HelloWS实现类HelloWSImpl。

package com.rvho.cxfstandalone.ws.impl;

import javax.jws.WebService;

import com.rvho.cxfstandalone.ws.HelloWS;

@WebService(
        endpointInterface = "com.rvho.cxfserver.ws.HelloWS",
        portName = "HelloWSPort",
        serviceName = "HelloWSService",
        targetNamespace = "http://www.tmp.com/services/hello"
    )
public class HelloWSImpl implements HelloWS {
    @Override
    public String welcome(String name) {
        return "Welcome " + name;
    }

}

发布服务

package com.rvho.cxfstandalone;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import com.rvho.cxfstandalone.ws.HelloWS;
import com.rvho.cxfstandalone.ws.impl.HelloWSImpl;

public class CxfServer {

    public static void main(String[] args) {
        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
        factory.setServiceClass(HelloWS.class);
        //服务发布的地址
        factory.setAddress("http://localhost:8999/services/hello");
        factory.setServiceBean(new HelloWSImpl());
        factory.create();
    }

}

在浏览器中输入服务发布地址http://localhost:8999/services/hello?wsdl如果看到如下内容,表示服务发布成功。

客户端

用wsimport或者wsdl2java把服务端发布的服务生成java对象。

wsimport是jdk提供的wsdl转java对象工具,在jdk的bin目录下可以找到。用法是

"D:\Program Files\Java\jdk1.8.0_25\bin\wsimport.exe" -encoding utf-8 -d D:\dev\wsdl\cxfserver\wsimport\compile -s D:\dev\wsdl\cxfserver\wsimport\src -p com.rvho.cxfclient.wsdl.wsimport.hello http://localhost:8999/services/hello?wsdl

wsdl2java是cxf提供的wsdl转java对象工具,在cxf的bin目录下可以找到。用法是

"D:\dev\library\java\cxf\apache-cxf-3.1.0\bin\wsdl2java" -p com.rvho.cxfclient.wsdl.cxf.hello -d D:\dev\wsdl\cxfserver\cxf\src http://localhost:8999/services/hello?wsdl

上面命令的路径是我本机路径,有可能不一样。

客户端可以通过jaxws调用,也可以通过cxf调用。

//jaxws调用
//URL不是必须的,除非服务的地址有改变
URL wsdlUrl = new URL("http://localhost:8999/services/hello?wsdl");
HelloWSService helloWSS = new HelloWSService(wsdlUrl);
HelloWS helloWS = helloWSS.getHelloWSPort();
String welcome = helloWS.welcome("[email protected]");
System.out.println(welcome);

/*
    cxf调用
    首先在客户端添加cxf
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.1.1</version>
    </dependency>
*/
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(HelloWS.class);
factory.setAddress("http://localhost:8999/services/hello");
HelloWS helloWS = factory.create(HelloWS.class);
String welcome = helloWS.welcome("[email protected]");
System.out.println(welcome);

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 05:23:48

WebService框架CXF实战(一)的相关文章

WebService框架CXF实战一发布RESTFul服务(七)

JAX-RS概述 JAX-RS是Java提供用于开发RESTful Web服务基于注解(annotation)的API.JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开发REST应用,避免了依赖第三方框架.同时JAX-RS使用POJO编程模型和基于注解的配置并集成JAXB,可以有效缩短REST应用的开发周期.JAX-RS只定义RESTful API,具体实现由第三方提供,如Jersey.Apache CXF等. JAX-RS包含近五十多个接口.注解和抽象类: ja

WebService框架CXF实战一传输文件(六)

CXF的文件传输通过MTOM实现.MTOM(SOAP Message Transmission Optimization Mechanism)SOAP消息传输优化机制,可以在SOAP消息中发送二进制数据.MTOM允许将消息中包含的大型数据元素外部化,并将其作为无任何特殊编码的二进制数据随消息一起传送.相对于把二进制转为base64进行传输,MTOM具有更高的传输效率. 文件传输包装类 CXF文件传输DataHandler只有二进制数据,没有文件名.文件类型和文件大小等,需要额外的传输参数.通常自

WebService框架CXF实战一拦截器Interceptor(四)

拦截器(Interceptor)是CXF功能最主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加很多功能.拦截器和JAX-WS Handler.Filter的功能类似,当服务被调用时,就会创建一个拦截器链(Interceptor Chain),拦截器链在服务输入(IN)或输出(OUT)阶段实现附加功能. 拦截器可以在客户端,也可以在服务端添加.当客户端发起一个WebService请求时,在客户端会创建输出拦截器链,服务端接收到客户端的后,会创建输入拦截器链.当服务端返回响应消息时,响应消

WebService框架CXF实战一自定义拦截器(五)

CXF已经内置了一些拦截器,这些拦截器大部分默认添加到拦截器链中,有些拦截器也可以手动添加,如手动添加CXF提供的日志拦截器.也可以自定义拦截器,CXF中实现自定义拦截器很简单,只要继承AbstractPhaseInterceptor或者AbstractPhaseInterceptor的子类(如AbstractSoapInterceptor)即可. 自定义权限认证拦截器 权限认证拦截器处理SOAPHeader中的认证信息,客户端在发起请求时在SOAPHeader中添加认证信息,服务端在接收到请求

WebService框架CXF实战一在Tomcat中发布WebService(二)

服务接口及实现类请参考WebService框架CXF实战(一) 创建Maven Web项目,在pom.xml中添加CXF和Spring Web的引用,由于CXFServlet需要Spring Web的支持. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&quo

webservice框架cxf

由于cxf的web项目已经集成了Spring,所以cxf的服务类都是在spring的配置文件中完成的.以下是步骤: 第一步:建立一个web项目. 第二步:准备所有jar包.将cxf_home\lib项目下的所有jar包全部copy到新项目的lib目录下,里面已经包含了spring3.0的jar包. 第三步:在web.xml中配置cxf的核心servlet,CXFServlet. 第四步:创建(最好是Copy)cxf-servlet.xml文件.这是一个spring的配置文件. 1.web.xml

webService框架CXF的简单使用

最近本来已经将上一个项目交活,全身心投入了另外项目的前端的开发工作.可之前的项目经理通知我,之前的项目需要做一个webService的功能,于是稍微做了一下webService,可是忘了通知我现在的项目经理,所以现在的项目经理以为我在做现在项目的前端工作,结果搞得很不好.然而我还是有私心的,因为目前两个项目需要使用的技术是我没有接触过的,而我的一个臭毛病就是对想做的喜欢做的技术会有莫名的兴奋感,每天早上起来的时候想到自己今天要将一个自己不了解的技术应用于工作中,就会很兴奋,恨不得立刻开始工作.总

WebService框架CXF实战一RESTFul服务(七)

JAX-RS概述 JAX-RS是Java提供用于开发RESTful Web服务基于注解(annotation)的API.JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开发REST应用,避免了依赖第三方框架.同时JAX-RS使用POJO编程模型和基于注解的配置并集成JAXB,可以有效缩短REST应用的开发周期.JAX-RS只定义RESTful API,具体实现由第三方提供,如Jersey.Apache CXF等. JAX-RS包含近五十多个接口.注解和抽象类: ja

CXF实战之在Tomcat中公布Web Service(二)

服务接口及实现类请參考WebService框架CXF实战(一) 创建Maven Web项目,在pom.xml中加入CXF和Spring Web的引用,因为CXFServlet须要Spring Web的支持. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&quo