文档章节

WebService之在 Web 容器中使用 Spring + CXF 发布 基于 SOAP 的WS

yope
 yope
发布于 2015/02/28 15:37
字数 1600
阅读 267
收藏 3
点赞 0
评论 0

Web Service,即“Web 服务”,简写为 WS。那么服务有服务需求方和提供服务方,顾名思义,提供服务方对外发布服务,而服务需求方则调用服务提供方发布的服务。

WS 其实就是建立在 HTTP 协议上实现异构系统通讯的工具,例如:可在 PHP 系统中调用 Java 系统对外发布的 WS,获取 Java 系统中的数据,或者把数据推送到 Java 系统中。

为了让 WS 的开发与使用变得更加简单、更加轻量级,于是出现了另一种风格的 WS,名为 JAX-RS(JSR-339),全称 Java API for RESTful Web Services,同样也是一种规范,同样也有若干实现,它们分别是:

其中,Jersey 是 Oracle 官方提供的实现,Restlet 是最老牌的实现,RESTEasy 是 JBoss 公司提供的实现,CXF 是 Apache 提供的实现。

可见,CXF 不仅用于开发基于 SOAP 的 WS,同样也适用于开发基于 REST 的 WS,这么好的框架我们怎能错过?

来接下来进入本文的主题:

在 Web 容器中使用 Spring + CXF 发布 WS

Tomcat + Spring + CXF,接近我们的实际开发

最后总结如下四点,

  1. 配置 web.xml

  2. 编写 WS 接口及其实现

  3. 配置 CXF 的 endpoint(端点)

  4. 启动 Web 容器

那么现在围绕着这四点来发布我们自己的WS

第一步,引入jar包,配置Maven pom.xml

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.sunsharing.demo</groupId>
  <artifactId>Spring</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Spring Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>3.1.1.RELEASE</spring.version>
       <junit.version>4.9.0</junit.version>
      <cxf.version>3.0.0</cxf.version>
  </properties>
  <dependencies>
   
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>${junit.version}</version>
        </dependency>
    
        <!-- 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>
  </dependencies>
  <build>
    <finalName>Spring</finalName>
    <plugins>
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
        <version>6.1.5</version>
        <configuration>
          <scanIntervalSeconds>10</scanIntervalSeconds>
          <connectors>
            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
              <port>8088</port>
            </connector>
          </connectors>
          <contextPath>/Spring</contextPath>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

第二步:配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
         version="3.0">
    <!-- Spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- CXF -->
    <servlet>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>
</web-app>

所有带有 /ws 前缀的请求,将会交给被 CXFServlet 进行处理,也就是处理 WS 请求了。

第三步,编写我们自己的WS

    首先是服务接口

    package com.sunsharing.rest_cxf;
/**
 * Created by nyp on 2015/2/28.
 */
import javax.jws.WebService;
@WebService
public interface HelloService {
    String say(String name);
}

    最后是服务接口的实现

package com.sunsharing.rest_cxf;

/**
 * Created by nyp on 2015/2/28.
 */
import org.springframework.stereotype.Component;
import javax.jws.WebService;

@WebService
@Component
public class HelloServiceImpl implements HelloService {

    public String say(String name) {
        return "hello " + name;
    }
}

值得一提的是引包,Component引入的是spring的包,作用当然是注解注入bean啦,好了我们简单的WS就写好了

第四步,就是配置 CXF 

接着web.xml中配置的spring.xml

<?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.1.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.1.xsd">
    <context:component-scan base-package="com.sunsharing.rest_cxf"/>
    <import resource="spring-cxf.xml"/>
</beans>

将配置文件分离,是一种很好的开发方式,到这里我们就就自觉地配置spring-cfx.xml

<?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"
       xmlns:simple="http://cxf.apache.org/simple"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://cxf.apache.org/jaxws
       http://cxf.apache.org/schemas/jaxws.xsd
       http://cxf.apache.org/simple
       http://cxf.apache.org/schemas/simple.xsd">
    <!--第一种-->
   <!-- <jaxws:server id="helloService" address="/soap/hello">
        <jaxws:serviceBean>
            <ref bean="helloServiceImpl"/>
        </jaxws:serviceBean>
    </jaxws:server>-->

    <!--第二种 -->
    <jaxws:endpoint id="helloService"  implementorClass="#helloServiceImpl" address="/soap/hello"/>

    <!--第三种-->
    <!--<simple:server id="helloService" serviceClass="#helloService" address="/soap/hello">
        <simple:serviceBean>
            <ref bean="#helloServiceImpl"/>
        </simple:serviceBean>
    </simple:server>-->
</beans>

注意:第二种方法中的 implementor 属性值是 #helloServiceImpl,这是 CXF 特有的简写方式,并非是 Spring 的规范,意思是通过 Spring 的 Bean ID 获取 Bean 实例。

#helloServiceImpl在IDEA中提示红色,并不是报错,不要瞎捣腾)三种方法推荐第二种方法,原因嘛两个字简洁。

说到这里值得一提的就是address="/soap/hello" 结合web.xml中配置的/ws 那么可想像之后的请求是长这个样子的“***/ws/soap/hello”

第五步:启动Web容器

将应用部署到 Tomcat 中,在浏览器中输入以下地址可进入 CXF 控制台:

http://localhost:8080/ws


当然我这个地址时报的是404,因为我在发布的项目时添加了项目名

我的实例中输入的地址

http://localhost:8080/Spring/ws

点击上图中的超链接亦或是在地址栏中输入

http://localhost:8080/Spring/ws/soap/hello?wsdl

可见如下页面


到这里,首先得恭喜你现在已经成功地通过 CXF 对外发布了 WS,下面要做的事情就是用 WS 客户端来调用这些 endpoint 了。

关于 CXF 提供的 WS 客户端

一共有五个方案

方案一:静态代理客户端

方案二:动态代理客户端

方案三:通用动态代理客户端

方案四:基于 CXF simple 方式的客户端

方案五:基于 Spring 的客户端

这里我们就只讲方案五,更多的方案实现请查阅 

Web Service 那点事儿(2)—— 使用 CXF 开发 SOAP 服务

本文也是基于这篇文章以及自己部署后总结所写。

首先是配置spring-client.xml

<?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-4.0.xsd
      http://cxf.apache.org/jaxws
      http://cxf.apache.org/schemas/jaxws.xsd">
 <!--使用 JaxWsProxyFactoryBean-->
 <!--  <bean id="factoryBean" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
       <property name="serviceClass" value="com.sunsharing.rest_cxf.HelloService"/>
       <property name="address" value="http://localhost:8080/Spring/ws/soap/hello"/>
   </bean>
   <bean id="helloService" factory-bean="factoryBean" factory-method="create"/>-->
   <!--使用 jaxws:client(推荐)-->
   <jaxws:client id="helloService"
                 serviceClass="com.sunsharing.rest_cxf.HelloService"
                 address="http://localhost:8080/Spring/ws/soap/hello"/>
</beans>

然后是客服端代码

package com.sunsharing.rest_cxf;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * Created by nyp on 2015/2/28.
 */
public class Client {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-client.xml");
        HelloService helloService = context.getBean("helloService", HelloService.class);
        String result = helloService.say("Spring world");
        System.out.println(result);
    }
}

最后想说的是,我们要结合实际选择方案


© 著作权归作者所有

共有 人打赏支持
yope
粉丝 15
博文 38
码字总数 33640
作品 0
厦门
程序员
mule发布调用webservice

mule发布webservice 使用mule esb消息总线发布和调用webservice都非常精简,mule包装了所有操作,你只需要拖控件配置就可以,下面讲解mule发布: 1.下面是flow,http监听接口,CXF发布webse...

jiazhipeng12 ⋅ 05/28 ⋅ 0

SOA调用wsdl报 No binding operation info while invoking unknown method with params unknown

根据xsd文件用cxf生成对应wsdl,提供给soa调用,soa调用报No binding operation info while invoking unknown method with params unknown 接口模式是订阅发布; 1.想询问如何定位问题;2.想...

cflulu-heixiong ⋅ 06/06 ⋅ 0

NutzBoot v2.1.7 新增 maven 插件和 mqtt-client

NutzBoot v2.1.7 已发布,更新如下: 新增maven插件和mqtt支持 时间: 2018-05-04 事件: 青年节 曲目: Penguin's Game 兼容性: 与2.0.x和2.1.x完全兼容 变更: fix: 修改jetty热加载无效问题 ...

wendal ⋅ 05/04 ⋅ 0

Web Service 那点事儿(2)—— 使用 CXF 开发 SOAP 服务

选框架犹如选媳妇,选来选去,最后我还是选了“丑媳妇(CXF)”,为什么是它?因为 CXF 是 Apache 旗下的一款非常优秀的 WS 开源框架,具备轻量级的特性,而且能无缝整合到 Spring 中。 其实...

黄勇 ⋅ 2014/07/02 ⋅ 45

使用cxf发布webservice总结

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

漂泊者及其影子 ⋅ 2014/08/21 ⋅ 0

Apache CXF 介绍

Apache CXF 简介 关于Apache CXF   Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XF...

hanfeng ⋅ 2014/07/04 ⋅ 1

Spring整合CXf WebService总结

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开...

afreon ⋅ 2015/06/19 ⋅ 0

Apache CXF 和 Spring 开发 Web Service 1

正文 为什么使用CXF 本文段摘录自 http://www.ibm.com/developerworks/cn/webservices/ws-pojo-springcxf/index.html Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务...

Cong_Cong ⋅ 2015/12/04 ⋅ 0

使用 Apache CXF 实现 Web Service 详解

1.Web service的概念 什么是WebService呢?从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web调用来实现某个功...

核桃白果 ⋅ 2013/08/08 ⋅ 10

一个WebService入门实例

1Web Service基本概念和CXF Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在 Web上提...

蜡笔小小小新 ⋅ 2015/12/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 43分钟前 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部