CN105528219A - 一种rest风格框架下响应的动态封装方法 - Google Patents
一种rest风格框架下响应的动态封装方法 Download PDFInfo
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/37—Compiler construction; Parser generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
Abstract
本发明提供一种REST风格框架下响应的动态封装方法,涉及动态封装技术领域,利用cglib库可以动态生成bean的特性,将需要返回的公用bean进行解析,提取其属性,并通过反射的方式添加定制的属性,生成新的bean,最后将属性值重新写入bean中,生成新bean实例,嵌入response中并返回。本发明使用方便,只需要调用工具类的一个静态方法即可完成整个动态封装过程,可以大大减少编写响应bean类的工作量,降低后期维护难度。
Description
技术领域
本发明涉及动态封装技术领域,尤其涉及一种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中的属性赋值。
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)
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 | 武汉斗鱼网络科技有限公司 | 一种获取数据的方法和相关装置 |
-
2016
- 2016-01-29 CN CN201610063560.0A patent/CN105528219A/zh active Pending
Non-Patent Citations (3)
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)
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 |