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

简介:

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地址,表死我们引用了这个结构定义。

    然后泥瓦匠用配置核心的配置。在<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
< bean id = "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:server id = "imaoPayService" address = "/ipservice" >
         <!-- 输入拦截器设置 -->
         < jaxrs:inInterceptors >
         </ jaxrs:inInterceptors >
         
         <!-- 输出拦截器设置 -->
         < jaxrs:outInterceptors >
         </ jaxrs:outInterceptors >
          
         <!-- serviceBeans-暴露的WebService服务类 -->
         < jaxrs:serviceBeans
             < ref bean = "regUser" />
         </ jaxrs:serviceBeans >
           
         <!-- 支持的协议 -->
         < jaxrs:extensionMappings
             < entry key = "json" value = "application/json" /> 
             < entry key = "xml"  value = "application/xml" /> 
         </ jaxrs:extensionMappings
         
         <!-- 编码格式 -->
         < jaxrs:languageMappings >
                < entry key = "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


相关文章
|
7天前
|
Java API 微服务
【Spring Boot系列】通过OpenAPI规范构建微服务服务接口
【4月更文挑战第5天】通过OpenAPI接口构建Spring Boot服务RestAPI接口
|
1月前
|
XML Java 数据库连接
spring boot 参数的过滤注解与实战
在Spring Boot应用中,对于入参的过滤,通常会涉及到对Web层的数据验证和处理。Spring Boot借助Spring框架提供了强大的验证框架支持,主要基于JSR-303/JSR-380(Bean Validation API)规范,以及Spring自身的@Valid或@Validated注解来实现请求参数的验证。以下是一些常见的使用案例来展示如何对参数进行过滤和验证。
29 1
|
1月前
|
传感器 Java API
Spring揭秘:Aware接口应用场景及实现原理!
Aware接口赋予了Bean更多自感知的能力,通过实现不同的Aware接口,Bean可以轻松地获取到Spring容器中的其他资源引用,像ApplicationContext、BeanFactory等。 这样不仅增强了Bean的功能,还提高了代码的可维护性和扩展性,从而让Spring的IoC容器变得更加强大和灵活。
127 0
Spring揭秘:Aware接口应用场景及实现原理!
|
1月前
|
Java Spring
使用JDBCTemplate实现与Spring结合,方法公用 ——测试(EmpDaoImplTest)
使用JDBCTemplate实现与Spring结合,方法公用 ——测试(EmpDaoImplTest)
9 0
|
27天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
65 1
|
27天前
|
存储 XML 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南(一)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
66 0
|
22小时前
|
canal 缓存 关系型数据库
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
|
13天前
|
Java 数据库 Spring
切面编程的艺术:Spring动态代理解析与实战
切面编程的艺术:Spring动态代理解析与实战
26 0
切面编程的艺术:Spring动态代理解析与实战
|
1月前
|
存储 缓存 安全
Spring Boot从入门到实战
本课程从SpringBoot的最基础的安装、配置开始到SpringBoot的日志管理、Web业务开发、数据存储、数据缓存,安全控制及相关企业级应用,全程案例贯穿,案例每一步的都会讲解实现思路,全程手敲代码实现。让你不仅能够掌SpringBoot的应用,还能了解背后的原理,学习完本课程后,能够让你动手独立完成一个中小型的SpringBoot Web应用开发。
19 1
Spring Boot从入门到实战
|
1月前
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
8 0

热门文章

最新文章