游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

统一响应接口封装

  在上一家公司中我经常看到接口中返回的直接是一个对象集。然而在响应后却又封装了{msg:,state:,obj:},这些参数我就很纳闷这个是如何实现的。我第一反应就是使用了AOP。但是找了许久并未发现哪里使用了AOP的形式。经过层层的深入我发现了一个接口和一个注解,才慢慢的打开迷层。ResponseBodyAdvice
  ResponseBodyAdvice这个接口一看就是通过增强器进行织入的,我们从Advice就可以看出。这个需要配合ControllerAdvice或者RestControllerAdvice
  ResponseBodyAdvice接口是spring4。1的特性,其作用是在响应体写出前做一些处理,比如修改返回值,加密等。允许在执行ResponseBody或ResponseEntity控制器方法之后但在使用HttpMessageConverter编写正文之前自定义响应。可以直接在RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver注册实现,或者更有可能在ControllerAdvice中注解,在这种情况下,它们都会被两者自动检测到。
  下面我们来看下这个接口的定义publicinterfaceResponseBodyAdviceT{此组件是否支持给定的控制器方法返回类型和所选的HttpMessageConverter类型。这个方法返回true后才会执行下面的beforeBodyWrite方法booleansupports(MethodParameterreturnType,Classlt;?extendsHttpMessageConverterlt;?converterType);在选择HttpMessageConverter之后且在调用其write方法之前调用NullableTbeforeBodyWrite(NullableTbody,MethodParameterreturnType,MediaTypeselectedContentType,Classlt;?extendsHttpMessageConverterlt;?selectedConverterType,ServerHttpRequestrequest,ServerHttpResponseresponse);}
  接口的使用我们直接在Controller进行增强,这里我们增强的是RestController看代码RestControllerAdvice(basePackagescom。kaysanshi)publicclassResponseControllerAdviceimplementsResponseBodyAdviceObject{Overridepublicbooleansupports(MethodParameterreturnType,Classlt;?extendsHttpMessageConverterlt;?converterType){获取当前controller请求的方法是否有SkipR注解SkipRskipRreturnType。getMethod()。getAnnotation(SkipR。class);if(null!skipR)returnfalse;是否是返回的R对象return!returnType。getMethod()。getReturnType()。equals(R。class);}OverridepublicObjectbeforeBodyWrite(Objectbody,MethodParameterreturnType,MediaTypeselectedContentType,Classlt;?extendsHttpMessageConverterlt;?selectedConverterType,ServerHttpRequestrequest,ServerHttpResponseresponse){这个地方是自己判断的其他的直接返回当前对象,不进行包装if(request。getHeaders()。containsKey(SecurityConstants。INNER)SecurityConstants。INNERTRUE。equalsIgnoreCase(request。getHeaders()。getFirst(SecurityConstants。INNER))){returnbody;}if(returnType。getGenericParameterType()。equals(String。class)){returnJSON。toJSONString(newR(body));}returnnewR(body);}}
  在这个beforeBodyWrite的方法中我们可以实现自己的想要的内容,这里有我们通过inner注解进行过滤了fegin中返回的封装,直接将响应返回到上游。当不是标示inner的调用,我们将其封装到返回实体的对象中。
  在看这个接口我发现FastJson也是通过对这个接口的实现,封装了一下将对象转为Json的使用。而我们不使用Rest处理的时候,就是FastJsonViewResponseBodyAdvice实现了对ResponseBodyAdvice的接口的实现
  对应的返回实体R对象的封装如下BuilderAccessors(chaintrue)AllArgsConstructorNoArgsConstructorDatapublicclassRTimplementsSerializable{privatestaticfinallongserialVersionUID9141307870732228707L;privateStringstate;privateStringmsg;privateTobj;publicR(Tobj){super();this。stateCommonConstants。SUCCESS;this。objobj;}publicR(FirstExceptione){super();this。statee。getCode();this。msge。getMessage();}publicR(FirstArgsExceptione){super();this。statee。getCode();this。msge。getMessage();}publicR(LogicExceptione){super();this。statee。getCode();this。msge。getMessage();}publicR(LogicArgsExceptione){super();this。statee。getCode();this。msge。getMessage();}publicR(AccessDeniedExceptione){super();this。stateSecurityConstants。ACCESSDENIED;this。msge。getMessage();}publicR(NotBreakerExceptione){super();this。statee。getCode();this。msge。getMessage();}publicR(Throwablee){super();if(InfoUtils。isContain(e。getMessage())){this。statee。getMessage();this。msgInfoUtils。getInfo(this。state);}else{this。stateCommonConstants。FAIL;this。msgInfoUtils。getInfo(FirstException。ERRORCODE);}}publicRTsuccess(Tobj){this。stateCommonConstants。SUCCESS;this。objobj;returnthis;}publicRTerror(Stringmsg){this。stateCommonConstants。FAIL;this。msgmsg;returnthis;}publicRTerror(){this。stateCommonConstants。FAIL;this。msgInfoUtils。getInfo(FirstException。ERRORCODE);returnthis;}JSONField(serializefalse)JsonIgnorepublicBooleangetIsSuccess(){returnObjects。equal(CommonConstants。SUCCESS,this。state);}publicStringtoJson(){returnJSON。toJSONString(this);}}
  经过以上的方式我们就可以做成一个全局的统一响应的封装。ControllerAdvice
  这样我们已经知道ControllerAdvice的一个应用场景,是结合ResponseBodyAdvice进行使用的,同样我们也可以将ControllerAdvice的应用到其他场景。比如:统一异常处理,全局数据绑定,全局数据处理(上面的可以算成这个场景)。user:kay三石time:8:44desc:公共的异常处理类ControllerAdvicepublicclassBaseExceptionHandler{ExceptionHandler(Exception。class)ResponseBodypublicBaseResulterror(Exceptione){e。printStackTrace();System。out。println(调用了公共异常处理类);returnBaseResult。notOk(e。getMessage());}}
  当然我们也可以通过这两个结合做一些其他方面的实现,其他的可以自行去查阅资料进行使用。这里我们主要是说的ResponseBodyAdvice和ControllerAdvice的一起使用返回统一的响应格式。

小米游戏鼠标Lite今日开售5挡可调DPIRGB灯效,129IT之家2月9日消息,上个月小米推出了一款小米游戏鼠标Lite并开启众筹,采用72g轻量化设计机身、TTC防尘金微动,支持5挡可调DPI,零售价129元,众筹价99元,今日这款……英特尔发布W680主板,12代酷睿消费级处理器也能支持ECCIT之家3月8日消息,据外媒TomsHardware消息,英特尔发布了W680芯片组,支持在12代酷睿消费级处理器上启用ECC内存。据报道,在最新的W680平台上,英特尔……英特尔12代酷睿9W处理器i71250U现身,10核12线程IT之家3月8日消息,在今年CES上,英特尔推出了12代酷睿AlderLakeM系列处理器,基础功耗只有9W。据Benchleaks消息,该系列的i71250U型号已经出现在了……消息称英特尔Arc高端桌面显卡将在5月推出IT之家3月8日消息,据VideoCardz消息,英特尔Arc显卡又一次延期,高端型号将在2022年5月2日至2022年6月1日之间推出。据报道,被推迟发布的高端型号都基……瑞芯微RV1106RV1103即将向客户提供样品,预计今年上4月21日,瑞芯微在投资者互动平台回应投资者关于公司年初发布的RV1106RV1103预计何时能够进入量产的问询时表示,RV1106RV1103是公司新一代机器视觉方案,在NP……AMDRX6300桌面独显出现在官方支持列表中最新架构亮机卡IT之家4月3日消息,今年1月份,AMD发布了RadeonRX6500XT和RadeonRX6400两款6nm台式机显卡,定位1080p游戏体验。爆料者KOMACHIENSAK……AMD发布Adrenalin22。3。2驱动,小缇娜的奇幻之IT之家3月25日消息,AMD现已发布发布Adrenalin22。3。2驱动,为新作《幽灵线:东京》和《小缇娜的奇幻之地》提供支持和优化。IT之家了解到,在新驱动下,RX……RedmiNote12渲染图5500mAh1亿像素,全系OL熟悉红米的小伙伴都知道购买红米手机有一个不成文的小窍门,那就是买双不买单。正是因为这个原因,非常多的小伙伴都是非常期待红米note12系列手机发布的。这不市面上就已经传来了,关……小米推出米家飞行员太阳镜Pilota,售价199元感谢IT之家网友王校长的线索投递!IT之家4月8日消息,小米现已推出米家飞行员太阳镜Pilota,经典飞行员款型,采用高清尼龙偏光镜片,UV400抵御紫外线,售价199元……小米推出定制便携咖啡杯316不锈钢内胆,109元感谢IT之家网友肖战割割的线索投递!IT之家4月8日消息,小米官网现已上架新款定制便携咖啡杯,500ml容量,内胆采用316不锈钢,售价109元。据介绍,小米新款便……华擎推出新款迷你主机NUC1200BOX最高可选12核i71IT之家3月2日消息,据PCWatch报道,华擎推出了新款迷你主机NUC1200BOX,搭载12代酷睿P系列处理器,最高可选i71260P。据报道,华擎新款迷你主机包括搭……6499元起,RedmiBookPro152022笔记本发布IT之家3月17日消息,今晚,RedmiBookPro2022笔记本正式发布,搭载12代酷睿H系列处理器,最高搭载英伟达RTX2050显卡。首先,CPU方面,RedmiB……
夜观牡丹竟然这么美?每年四至五月,牡丹、芍药相继开放,游客一进入汉牡丹园就能看到牡丹、芍药的端庄和艳丽,沉浸在花的海洋里。据悉,河北柏乡县汉牡丹园景区精心打造的首届夜观牡丹活动将在4月19日……专访OPPO首席产品官刘作虎做产品,我们守正不出奇本文来源:时代财经作者:王婷OPPO高级副总裁兼首席产品官刘作虎图源:时代财经3月,手机行业热闹非凡,重磅发布会一场接一场。21日,OPPO在深圳湾体育中心发……各大奖项颗粒无收,辽篮把目标瞄准总冠军,郭艾伦韩德君全力以赴如今常规赛各大奖项已经出炉,胡金秋获得了联赛MVP,这一点基本是没有悬念的,本身他的数据就非常有说服力,另外胡金秋的呼声也非常高无论是球迷还是媒体人,都非常的看好他。沈梓捷则是……冻饺子时,直接放冰箱就废了,牢记2点,和刚包的一样鲜导语:冻饺子时,直接放冰箱就废了,牢记2个基本点,饺子不粘连不开裂,和新包的一样鲜!一餐一饭,心有所栖。柴米油盐,爱有所依。静看一树花开,慢享三餐四季。大家好,我是爱美食……今日立夏,老话立夏一碗汤,不劳医生帮,一碗汤指的是啥?时间犹如白驹过隙,还没好好地享受春天烂漫的时光,转眼之间就已经立夏了,立夏标志着夏天的到来,夏天是一个充满活力的季节,瓜果成熟,花草树木茁壮成长,天气也变得越来越热了。正……内江市建设两个高铁站,一起走进内江看下旅行,不光是看风景,更是看世间人生百态,高铁改变旅游市场群体,其舒适性、便捷性和时间可掌控性。如今,内江市建设两个高铁站,一起走进内江看下。高铁内江市规划建设两座高……IFA2022中国头部家电企业展现高超实力2022年9月2日6日,2022年柏林消费电子产品及家用电器展览会(简称IFA2022)在德国柏林举行。一年一度的IFA展是世界上规模最大、品类最齐全的电子消费展之一。I……有一种善良,人不知,天知01。hr风尘渺渺,人生匆匆。总会有一些往事,留存在人的记忆里。也会有一些回忆,将人性深处的迷惘一一打开。如花美眷,总是经不住似水流年;鲜衣怒马,总会留不住激……NBA为什么会西强东弱,谁才是幕后黑手在NBA里有的球员从进联盟就一直巅峰到现在,有的球员昙花一现,强劲的选手有的会一直留在球队,有的强劲球员喜欢到处乱跑,就导致局面有点难控。这是,肖华来了都不好使!其……美白祛斑护肤品套装哪款好?安利2022榜单前三高能祛斑因为一白遮三丑的传统美观念,亚洲女性对于美白的追求,就像人类对于光明的追求一样从未停止,所以护肤品是每个女性都会入手的产品。当脸上长了斑以后,很多人都会将日常用的护肤品更换为祛……体质太差的人要补脾胃!中医健脾秘诀全奉上民以食为天,没有饮食物源源不断地输入人体,人的生命不可能得到维持。而食物要真正成为生命的原动力,必须经过消化吸收的过程。在这个过程中,脾胃发挥了非常重要的作用。脾胃……共享经济8年沉浮3000家公司倒闭,伪共享终究难以为继文小可(公众号:海哥商业观察ID:hgsygc)近日,家住成都市锦江区的朱霖在东大街地铁站扫了一辆美团单车,骑行15分钟到达小区楼下还车后,她收到了扣费1。5元的系统提示……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网