文档章节

[CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口

泥沙砖瓦浆木匠
 泥沙砖瓦浆木匠
发布于 2015/02/26 21:36
字数 1459
阅读 5405
收藏 21
点赞 0
评论 1

Writer:BYSocket(泥沙砖瓦浆木匠)

Reprint it anywhere u want.

文章Points:

1、介绍RESTful架构风格

2、Spring配置CXF

3、三层初设计,实现WebService接口层

4、撰写HTTPClient 客户端,并实现简单调用

 

介绍RESTful架构风格

    REST是REST之父Roy Thomas创造的,当时提出来了REST的6个特点:客户端-服务器的、无状态的、可缓存的、统一接口、分层系统和按需编码。其具有跨语言和跨平台的优势。

    REST是一种架构风格。其描述性的状态包括资源数据的内容和表达格式(XML,JSON等)。请求其中一个资源:方为一个指定性和描述性的URI,经由HTTP将资源的表达从服务器转移到客户端,或者相反方向。

    REST不是一种技术,也不是一个标准或者协议,它拥有标准:HTTP+URI+XML(JSON),来实现其要求的架构风格。

   

    泥瓦匠的记忆宫殿:“REST其实就像万能规则一样。如果你遵循它的规则的话,就能得她提供给你的资源数据。”

 

Spring配置CXF

    泥瓦匠用的是Spring4.0.x和CXF3.0.x版本。有兄长说过让我用其他的轻量级的Web Service框架,我最后考虑了下还是用CXF。

 

1、第一步配置所需的依赖包jars

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxrs</artifactId>
    <version>3.0.3</version>
</dependency>

在以前2.x的CXF上,bug和配置上很复杂。3.0以后很方便,用了MAVEN后,就是直接拷贝下上面的代码放到pom.xml即可。

 

2、配置Spring文件

    首先配置CXF所需的XSD地址,表死我们引用了这个结构定义。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

    然后泥瓦匠用配置核心的配置。在<beans></beans>直接加入所需要的cxf配置。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<beanid="regUser"class="com.xidian.wq.imaopay.controller.webservice.UserInfoController"></bean>
     
    <!-- CXF 拦截器 <ref bean="tokenInterceptor" />
    <bean id="tokenInterceptor" class="com.xidian.wq.imaopay.interceptor.cxf.TokenInterceptor" />
     -->
      
    <!-- address-请求路径 -->
    <jaxrs:serverid="imaoPayService"address="/ipservice">
        <!-- 输入拦截器设置 -->
        <jaxrs:inInterceptors>
        </jaxrs:inInterceptors>
         
        <!-- 输出拦截器设置 -->
        <jaxrs:outInterceptors>
        </jaxrs:outInterceptors>
          
        <!-- serviceBeans-暴露的WebService服务类 -->
        <jaxrs:serviceBeans> 
            <refbean="regUser"/>
        </jaxrs:serviceBeans>
           
        <!-- 支持的协议 -->
        <jaxrs:extensionMappings> 
            <entrykey="json"value="application/json"/> 
            <entrykey="xml" value="application/xml"/> 
        </jaxrs:extensionMappings> 
         
        <!-- 编码格式 -->
        <jaxrs:languageMappings>
               <entrykey="en"value="en-gb"/>
        </jaxrs:languageMappings>
         
    </jaxrs:server>

    根据代码的备注,泥瓦匠想让大家记住几点重要性的点。

address=”/ipservice” 表示我们以后用此地址访问所提供的地址。

<jaxrs:serviceBeans><jaxrs:serviceBeans/> 之间加入我们要暴露出去的服务类。这里泥瓦匠以一个简单的注册类来提供。

jaxrs:extensionMappings 是表示我们需要支持的协议。

 

3、UserInfoController是我们需要完成的暴露服务类。下面泥瓦匠说一下初设计(这点请大家指点指点)。

 

三层初设计,实现WebService接口层

    初设计:

    按着原来的SpringMVC的三层架构,我这边把原来的Controller层转为暴露在出来的接口服务类。自然View层也就没了。

 

UserInfoController的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Path("/user")// 访问路径
@Produces("*/*")
public class UserInfoController
{
     @POST
    @Path("/doTest")// 访问路径
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})// 响应内容 MIME 类型
    public String doTest(String requestXml)//@QueryParam("regRequestXml")
    {
        System.out.println("服务端获取到客户端的报文如下:\n"+requestXml);
         
        /* 构造响应报文 */
        String responseXml = "响应的报文内容";//构造报文 XML 格式的字符串
         
        return responseXml;
    }
}

暴露的接口层,也可以用inteface类加实现类来完成。泥瓦匠觉得多此一举,兴许我大言不惭。

    泥瓦匠总结如下:

    @POST 表示HTTP的访问模式

    @Path 表示访问路径

    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 响应内容 MIME 类型

 

    泥瓦匠还在上一篇写过了对报文的处理:JAXB xml与javaBean的转换。具体请查阅。

 

HTTPClient 客户端,并实现简单调用

    “实践出真理。”拿出来遛一遛即可。泥瓦匠简单的用HTTPClient访问

核心代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
    * 注册报文发送案例
    */ 
   private void doRegXml() throws Exception
   { 
       /** 构造测试报文头对象 */
       String randNum = RandomStringUtils.randomNumeric(8);//八位
       String timeStr = TimeUtil.getTimeSimple();
       DataBean dataBean = new DataBean();
       dataBean.setBatch_no("N20150204");
       dataBean.setData_type("000001");
       dataBean.setVersion("v1.0");
       dataBean.setUser_name("13957706713");
       dataBean.setMsg_sign("未知");
       dataBean.setRd_num(randNum);
       dataBean.setRd_time(timeStr);
       dataBean.setK_sign(TokenCheckUtil.getSignature(null, timeStr, randNum));
 
       /** 构造测试报文体对象 */
       RegBean regBean = new RegBean();
       regBean.setReg_sn("REG20150204");
       regBean.setUser_id(15);
       regBean.setReg_no("33");
       regBean.setReg_way("pc");
       regBean.setSet_time(TimeUtil.getTimeAll());
       regBean.setRet_url("未知");
       regBean.setRemarks("无备注");
        
       RegBean regBean2 = new RegBean();
       regBean2.setReg_sn("REG20150203");
       regBean2.setUser_id(13);
       regBean2.setReg_no("44");
       regBean2.setReg_way("mobile");
       regBean2.setSet_time(TimeUtil.getTimeAll());
       regBean2.setRet_url("未知");
       regBean2.setRemarks("无备注");
        
       List<RegBean> regBeans = new ArrayList<RegBean>();
       regBeans.add(regBean);
       regBeans.add(regBean2);
        
       MsgRegBean msgRegBean = new MsgRegBean();
       msgRegBean.setDataBean(dataBean);
       msgRegBean.setRegBeans(regBeans);
        
       String regRequestXml = JaxbObjectAndXmlUtil.object2Xml(msgRegBean);//构造报文 XML 格式的字符串
        
       System.out.println("\n 请求报文XML: \n"+regRequestXml);
        
       /** 获取的Result报文,然后客户端处理业务。 */
       String resultString = HttpUtil.doPost(" http://localhost:8080/imaopay/pay/ipservice/user/doTest",regRequestXml);
        
       System.out.println("\n 获取的Result报文: \n"+resultString);
        
   }

运行后,控制台打印出如下结果:

客户端打印如下:

image

服务端获取结果如下:

image

Writer:BYSocket(泥沙砖瓦浆木匠)

Reprint it anywhere u want.

© 著作权归作者所有

共有 人打赏支持
泥沙砖瓦浆木匠

泥沙砖瓦浆木匠

粉丝 794
博文 139
码字总数 170656
作品 4
杭州
程序员
加载中

评论(1)

泥沙砖瓦浆木匠
泥沙砖瓦浆木匠
0@红薯 学长请过目
使用cxf发布webservice总结

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

漂泊者及其影子
2014/08/21
0
0
spring+restful service

Spring整合CXF,发布RSETful 风格WebService 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有很大一部分都是一样的。关于发布CXF WebServer和Spring整合CXF这里就不再多加赘述...

游宵
2014/04/25
0
1
Web Service 那点事儿(2)—— 使用 CXF 开发 SOAP 服务

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

黄勇
2014/07/02
0
45
Web Service 那点事儿(4)—— 使用 CXF 开发 REST 服务

现在您已经学会了如何使用 CXF 开发基于 SOAP 的 Web 服务,也领略了 Spring + CXF 这个强大的组合,如果您错过了这精彩的一幕,请回头看看这篇吧: [Web Service 那点事儿(2) —— 使用 ...

黄勇
2014/07/23
0
43
疯狂Spring Cloud连载(10)——Rest客户端Feign介绍

本文节选自《疯狂Spring Cloud微服务架构实战》 京东购买地址:https://item.jd.com/12256011.html 当当网购买地址:http://product.dangdang.com/25201393.html Spring Cloud教学视频:htt...

杨大仙的程序空间
2017/10/19
0
3
Apache CXF 整合Spring

一、创建一个 Java Web 工程,目录最终的结构如下图,下面我们将遂一说明: 二、把我们要用到的jar包全部放到lib目录下。 三、修改web.xml文件,整合CXF。 <?xml version="1.0" encoding="UT...

yaokangjun
2014/08/20
0
1
cxf webservice整合spring

前端建模:CXF 提供了前端建模的概念,允许您使用不同的前端 API 来创建 Web 服务。API 允许您使用简单的工厂 Bean 并通过 JAX-WAS 实现来创建 Web 服务。它还允许您创建动态 Web 服务客户端...

尚浩宇
2015/06/24
0
0
CXF发布webservice

CXF 是两个框架集合,基于XFire. 下载地址http://cxf.apache.org/download.html 我使用的是3.0version 如果javaPorject工程需要引入以下jar cxf-core-3.0.0-milestone2.jar geronimo-servle...

wsl_Mr
2014/04/09
0
2
apache CXF wsdl2java工具的使用

最近,由于要用到某公司提供的webservice实现的api接口,想到了用cxf的wsdl2java工具来生成客户端程序。(自己写是比较麻烦且费时,so偷懒一下、、) 使用步骤如下: 一、下载apache cxf的包...

Yao淡定
2014/02/21
0
0
使用 Apache CXF 实现 Web Service 详解

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

核桃白果
2013/08/08
0
10

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CDH的坑之Sqoop导出数据到MySQL

CDH的坑之Sqoop导出数据到MySQL 最近使用Sqoop从Hive导出数据到MySQL中,出现了一系列的问题,下面将这个问题记录一下,避免再度踩坑! 导出语句 sqoop export --connect jdbc:mysql://192....

星汉
5分钟前
0
0
Hyperledger Fabric 客户端开发三

前面两篇文章介绍了Hyperledger Fabric SDK并使用一个实例介绍如何通过SDK和Hyperledger Fabric Blockchain交互, 现在详细分析相关的过程。 首先看 enroll (登录) admin 过程。 'use stric...

十一月不远
6分钟前
0
0
PowerDesigner连接MySQL和逆向工程图

最近想梳理公司项目的表间关系,从项目后台管理系统的操作入手,以及代码的hibernate注解入手,都不算特别尽人意,于是最后还是鼓捣了一下PowerDesigner的逆向工程图,这样更直观一些。 想着...

Oo若离oO
6分钟前
0
0
威胁web应用安全的错误

一般绝大部分的web应用攻击都是没特定目标的大范围漏洞扫描,只有少数攻击确实是为入侵特定目标而进行的针对性尝试。这两种攻击都非常频繁,难以准确检测出来,许多网站的web应用防火墙都无法...

上树的熊
9分钟前
2
0
pypy2 install crypto error

install pycryptodome instead pip install pycryptodome

coord
13分钟前
0
0
Service Mesh所应对的8项挑战

Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多是基于proxy-b...

好雨云帮
22分钟前
0
0
时间复杂度

1. 维基上的定义 在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低...

liuyan_lc
28分钟前
0
0
js中的~符

~是js里的按位取反操作符,~~就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是 ~~true === 1,~~false === 0...

JamesView
29分钟前
0
0
webpack安装

npm install --save-dev webpack-cli

Vincent-Duan
31分钟前
0
0
实时监听EditText内容变化

主要是addTextChangedListener方法的使用 aswerEdittext.addTextChangedListener(new TextWatcher() { //编辑框的内容发生改变之前的回调方法 @Override public void before...

王先森oO
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部