CN105528219A - 一种rest风格框架下响应的动态封装方法 - Google Patents

一种rest风格框架下响应的动态封装方法 Download PDF

Info

Publication number
CN105528219A
CN105528219A CN201610063560.0A CN201610063560A CN105528219A CN 105528219 A CN105528219 A CN 105528219A CN 201610063560 A CN201610063560 A CN 201610063560A CN 105528219 A CN105528219 A CN 105528219A
Authority
CN
China
Prior art keywords
bean
attribute
response
dynamic encapsulation
generated
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201610063560.0A
Other languages
English (en)
Inventor
赵山
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Inspur Electronic Information Industry Co Ltd
Original Assignee
Inspur Electronic Information Industry Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Inspur Electronic Information Industry Co Ltd filed Critical Inspur Electronic Information Industry Co Ltd
Priority to CN201610063560.0A priority Critical patent/CN105528219A/zh
Publication of CN105528219A publication Critical patent/CN105528219A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/37Compiler construction; Parser generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management

Abstract

本发明提供一种REST风格框架下响应的动态封装方法,涉及动态封装技术领域,利用cglib库可以动态生成bean的特性,将需要返回的公用bean进行解析,提取其属性,并通过反射的方式添加定制的属性,生成新的bean,最后将属性值重新写入bean中,生成新bean实例,嵌入response中并返回。本发明使用方便,只需要调用工具类的一个静态方法即可完成整个动态封装过程,可以大大减少编写响应bean类的工作量,降低后期维护难度。

Description

一种REST风格框架下响应的动态封装方法
技术领域
本发明涉及动态封装技术领域,尤其涉及一种REST风格框架下响应的动态封装方法,用于按照REST风格动态构建含有不同类型属性的响应。
背景技术
在REST风格的框架下,描述一个Web服务的接口通常需要包含如下元素:
用于标识被请求资源的URL地址(URI)
请求资源的方法(HTTPMethod)
请求的参数(RequestBody)
响应的参数(Response)
其中RequestBody和Response中的参数通常以预定义的数据结构进行保存。在REST风格的框架下,对于具有相同URI和HTTPMethod的请求,若RequestBody中的参数不同,那么返回的Response可能具有完全不同的数据结构。若想实现在相同URI和HTTPMethod下返回不同结构的响应,常见思路有以下三种:
1.在Response中置入一个Map,Map中包含响应中的所有信息。其优点是组装方式比较灵活。缺点是响应结构没有直观的定义,并且使用Swagger等API生成框架生成的API中无法正常的解析response结构。
2.在Response中置入一个bean,该bean包含所有响应中可能包含的属性。优点是用一个bean定义了所有的响应类型,且在API生成框架中能够正常解析显示。缺点是如果响应类型很多,那么bean中包含的属性也会非常多,不但不利于后期维护,生成的API文档也不易阅读。
3.在Response中置入一个bean,该bean需要继承一个包含不同类型响应中都具有的属性的公共bean,bean中只需要定义某类响应特有的属性即可。本方法作为方法2的改进版,其优点是响应结构直观易懂,且在API生成框架中能够正常解析显示。缺点是如果响应的种类很多,仍然需要编写大量的bean文件,增加了工作量和后期维护的难度。
发明内容
为了解决以上技术问题,本发明提出了一种REST风格框架下响应的动态封装方法,旨在提供一种结构直观,能被API生成框架正确解析,同时不需要编写大量bean文件,而通过动态附加属性的方式生成响应的方法。使用本发明可以有效的减少编写bean文件的工作量,降低后期维护的难度。
本发明利用了cglib库动态生成bean的特性,对给定的公共bean进行解析,获取其属性,并增加新的定制属性,然后重新封装成bean。新生成的bean类型与公共bean一致,且同时具有公共bean的属性和定制属性,并且属性值也得到了保留。
本发明的技术方案:
一种REST风格框架下响应的动态封装方法,
利用cglib库可以动态生成bean的特性,将需要返回的公共bean进行解析,提取其属性,并通过反射的方式添加定制的属性,生成新的bean,最后将属性值重新写入bean中,生成新的bean实例,嵌入response中并返回。
利用BeanInfo和PropertyDescriptor对bean进行解析,并获取属性的名称、类型,并通过反射机制调用bean的getter方法获取属性值。
通过反射的方式添加定制的属性,生成新的bean:利用BeanGenerator添加bean属性,并构建新的bean对象。
将属性值重新写入bean中:利用BeanMap向bean中的属性赋值。
本发明的有益效果是:
本发明通过调用一个静态函数,即可动态的向一个给定bean中附加定制属性,而无需编写大量的bean文件。同时新获取的bean实例类型与给定bean相同,规范性得到了保证,在Swagger等API生成框架中也可以正确的解析,有效降低了开发难度和后期维护难度。
为REST风格框架下相同URI和HTTPMethod下需要返回不同类型响应的需求提供了简易的响应封装方式,并且可以支持第三方API生成框架的解析。由于是直接对返回的响应实例附加属性,所以不再需要针对不同的响应编写bean文件,大大降低了工作量和后期维护的难度。
附图说明
图1是本发明的整体处理过程示意图。
具体实施方式
下面对本发明的内容进行更加详细的阐述:
本发明利用了cglib库动态生成bean的特性,对给定的公共bean进行解析,获取其属性,并增加新的定制属性,然后重新封装成bean。新生成的bean类型与公共bean一致,且同时具有公共bean的属性和定制属性,并且属性值也得到了保留。
如图1所示,具体方案如下:
1.ResponseBeanUtil类
ResponseBeanUtil类是本发明的主体,包含了如下内容:
a)私有变量bean、beanMap、typeMap。bean用于保存新生成的bean对象,beanMap用于保存bean中的属性和值,typeMap用于保存bean中的属性和属性类型
b)构造方法ResponseBeanUtil
c)用于反向解析bean、添加定制属性并重新生成bean的createBean方法
d)向新生成的bean的属性赋值的setValue方法
e)获取新生成的bean实例的getObject方法
f)直接对外提供使用的静态方法addPropertyToBean,封装了整个bean的转化流程。
2.ResponseBeanUtil构造方法
构造方法ResponseBeanUtil定义如下:
privateResponseBeanUtil(TinputBean,Map<String,Class<?>>propMap)
输入参数inputBean为需要附加定制属性的公共bean,propMap为定制属性的名称和类型。
本方法处理流程如下:
a)利用BeanInfo和PropertyDescriptor将inputBean进行解析,获取inputBean的属性名称、类型以及值,将获得的属性名称和类型以及propMap中的定制属性名称和类型保存在私有变量typeMap中。
b)调用createBean方法根据inputBean的类型和typeMap生成新的bean,并保存在私有变量bean中。
c)根据新生成的bean创建BeanMap实例,保存在私有变量beanMap中。
d)将步骤1)中获取的inputBean的属性和值保存在私有变量beanMap中。
3.createBean方法
方法定义如下:
privateTcreateBean(Class<?>clazz,Map<String,Class<?>>propMap)
输入参数clazz为要生成的bean的类型,propMap为要生成的bean的属性与属性类型。
本方法处理流程如下:
a)创建BeanGenerator实例beanGen
b)从propMap中获取属性与属性类型,并添加到beanGen中
c)向beanGen中添加父类clazz,以使返回的类的类型与clazz相同
d)使用beanGen创建新bean,转化成clazz类型后返回。
4.setValue方法
方法定义如下:
privatevoidsetValue(Stringproperty,Objectvalue)
输入参数property为属性名称,value为属性值
本方法向私有变量beanMap中添加输入的属性和值。
5.getObject方法
方法定义如下:
privateTgetObject()
本方法用于获取私有变量bean的值。
6.addPropertyToBean方法
方法定义如下:
publicstatic<T>TaddPropertyToBean(Tbean,StringpropName,Objectobj)
输入参数bean为需要添加定制属性的公共bean,propName为定制属性的名称,obj为定制属性的值
本方法是最终暴露给用户的方法,用户通过直接调用本方法即可完成bean的转化封装,处理流程如下:
a)调用构造方法ResponseBeanUtil创建ResponseBeanUtil的实例pb
b)调用pb.setValue()方法添加定制属性和属性值
调用pb.getObject()方法获取新生成的bean实例并返回。

Claims (4)

1.一种REST风格框架下响应的动态封装方法,其特征在于,
利用cglib库可以动态生成bean的特性,将需要返回的公共bean进行解析,提取其属性,并通过反射的方式添加定制的属性,生成新的bean,最后将属性值重新写入bean中,生成新的bean实例,嵌入response中并返回。
2.根据权利要求1所述的方法,其特征在于,利用BeanInfo和PropertyDescriptor对bean进行解析,并获取属性的名称、类型,并通过反射机制调用bean的getter方法获取属性值。
3.根据权利要求1所述的方法,其特征在于,通过反射的方式添加定制的属性,生成新的bean:利用BeanGenerator添加bean属性,并构建新的bean对象。
4.根据权利要求1所述的方法,其特征在于,将属性值重新写入bean中:利用BeanMap向bean中的属性赋值。
CN201610063560.0A 2016-01-29 2016-01-29 一种rest风格框架下响应的动态封装方法 Pending CN105528219A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610063560.0A CN105528219A (zh) 2016-01-29 2016-01-29 一种rest风格框架下响应的动态封装方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610063560.0A CN105528219A (zh) 2016-01-29 2016-01-29 一种rest风格框架下响应的动态封装方法

Publications (1)

Publication Number Publication Date
CN105528219A true CN105528219A (zh) 2016-04-27

Family

ID=55770468

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610063560.0A Pending CN105528219A (zh) 2016-01-29 2016-01-29 一种rest风格框架下响应的动态封装方法

Country Status (1)

Country Link
CN (1) CN105528219A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108446105A (zh) * 2018-02-08 2018-08-24 广州亦云信息技术股份有限公司 一种轻量级API Server开发框架及开发方法
CN110795098A (zh) * 2018-08-02 2020-02-14 武汉斗鱼网络科技有限公司 一种获取数据的方法和相关装置

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
爱程序网: "Cglib动态代理和jdk动态代理", 《HTTP://WWW.AICHENGXU.COM/JAVA/7508099.HTM》 *
网友: "cglib之BeanGenerator", 《HTTP://WWW.FILOON.COM/CGLIB-BEANGENERATOR/》 *
网友: "java利用JAX-RS快速开发RESTful服务", 《HTTP://BLOG.CSDN.NET/A258831020/ARTICLE/DETAILS/49076903》 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108446105A (zh) * 2018-02-08 2018-08-24 广州亦云信息技术股份有限公司 一种轻量级API Server开发框架及开发方法
CN110795098A (zh) * 2018-08-02 2020-02-14 武汉斗鱼网络科技有限公司 一种获取数据的方法和相关装置
CN110795098B (zh) * 2018-08-02 2022-11-11 武汉斗鱼网络科技有限公司 一种获取数据的方法和相关装置

Similar Documents

Publication Publication Date Title
CN105069118B (zh) 一种基于gis配置的应用场景管理方法及系统
CN105302550B (zh) 将页面转为版式数据流文件的方法及系统
CN104573066B (zh) 页面复用方法及装置
CN108572825B (zh) 一种用户界面处理方法、装置及设备
CN106843835A (zh) 一种元数据定制的应用系统软件构建系统、系统构建方法
CN104484216A (zh) 服务接口文档和在线测试工具生成方法、装置
CN103645908A (zh) 网构软件全生命周期开发实现系统
CN103559040A (zh) 一种基于sdk快速构建移动互联网应用模块的系统和方法
CN103336691A (zh) 一种基于Android的动态布局方法及系统
KR20150043333A (ko) 선언형 템플릿을 사용하여 컨트롤을 스탬프 아웃하기 위한 사용자 인터페이스 컨트롤 프레임워크
CN103677789A (zh) 基于grid组件的列表数据展现方法及系统
US8407179B2 (en) Method of determining influence of a member within a dataset
CN105117234A (zh) 一种web控件组合方法
CN114519156A (zh) 一种网页展示方法、操作事件记录方法及装置
CN111611518A (zh) 基于Html5的可视化展示页面自动发布方法及系统
WO2022048141A1 (zh) 一种图像处理方法及装置、计算机可读存储介质
TW201727561A (zh) 服務組件管理方法及系統
CN106294299A (zh) 一种报表生成方法及装置
CN108572817B (zh) 基于业务建模的资源动态配置的方法、装置和介质
CN105528219A (zh) 一种rest风格框架下响应的动态封装方法
CN101944133B (zh) 一种xml元数据对象化解析方法及系统
US10089406B2 (en) Generating web pages with integrated content
CN107391175B (zh) 控件数据配置方法及计算机可读存储介质
CN101710971A (zh) 生成页面的方法和装置
CN107247594B (zh) 逻辑系统及其实现方法、计算设备及计算机可读存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20160427