范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

统一响应接口封装

  在上一家公司中我经常看到接口中返回的直接是一个对象集。然而在响应后却又封装了{msg:"",state:"",obj:""},这些参数我就很纳闷这个是如何实现的。我第一反应就是使用了AOP。但是找了许久并  未 发现哪里使用了AOP的形式。经过层层的深入我发现了一个接口和一个注解,才慢慢的打开迷层。   ResponseBodyAdvice
  ResponseBodyAdvice 这个接口一看就是通过增强器进行织入的,我们从Advice就可以看出。这个需要配合@ControllerAdvice或者@RestControllerAdvice
  ResponseBodyAdvice接口是spring4.1的特性,其作用是在响应体写出前做一些处理,比如修改返回值,加密等。允许在执行@ResponseBody或ResponseEntity控制器方法之后但在使用HttpMessageConverter编写正文之前自定义响应。可以直接在RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver注册实现,或者更有可能在@ControllerAdvice中注解,在这种情况下,它们都会被两者自动检测到。
  下面我们来看下这个接口的定义   public interface ResponseBodyAdvice { 	/** 	 * 此组件是否支持给定的控制器方法返回类型和所选的HttpMessageConverter类型。 	 * 这个方法返回true后才会执行下面的beforeBodyWrite方法 	 */ 	boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType); 	/** 	 * 在选择HttpMessageConverter之后且在调用其write方法之前调用 	 */  	@Nullable 	T beforeBodyWrite(@Nullable T body, MethodParameter returnType, MediaType selectedContentType, 			Class<? extends HttpMessageConverter<?>> selectedConverterType, 			ServerHttpRequest request, ServerHttpResponse response); }
  接口的使用我们直接在Controller进行增强,这里我们增强的是RestController看代码   @RestControllerAdvice(basePackages = "com.kaysanshi") public  class ResponseControllerAdvice implements ResponseBodyAdvice {     @Override     public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {         // 获取当前controller请求的方法是否有SkipR注解         SkipR skipR = returnType.getMethod().getAnnotation(SkipR.class);         if(null != skipR)             return  false;         // 是否是返回的R对象         return !returnType.getMethod().getReturnType().equals(R.class);     }     @Override     public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,             Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,             ServerHttpResponse response) {          // 这个地方是自己判断的其他的直接返回当前对象,不进行包装            if(request.getHeaders().containsKey(SecurityConstants.INNER) && SecurityConstants.INNER_TRUE.equalsIgnoreCase(request.getHeaders().getFirst(SecurityConstants.INNER))) {             return body;         }         if (returnType.getGenericParameterType().equals(String.class)) {             return JSON.toJSONString(new R<>(body));         }         return new R<>(body);     } }
  在这个beforeBodyWrite的方法中我们可以实现自己的想要的内容,这里有我们通过inner注解进行过滤了fegin中返回的封装,直接将响应返回到上游。当不是标示inner的调用,我们将其封装到返回实体的对象中。
  在看这个接口我发现FastJson也是通过对这个接口的实现,封装了一下将对象转为Json的使用。而我们不使用Rest处理的时候,就是 FastJsonViewResponseBodyAdvice  实现了对ResponseBodyAdvice的接口的实现
  对应的返回实体R对象的封装如下 @Builder @Accessors(chain = true) @AllArgsConstructor @NoArgsConstructor @Data public class R implements Serializable {     private static final long serialVersionUID = -9141307870732228707L;               private String state;     private String msg;     private T obj;          public R(T obj){         super();         this.state = CommonConstants.SUCCESS;         this.obj = obj;     }          public R(FirstException e) {         super();         this.state = e.getCode();         this.msg = e.getMessage();     }          public R(FirstArgsException e) {         super();         this.state = e.getCode();         this.msg = e.getMessage();     }          public R(LogicException e) {         super();         this.state = e.getCode();         this.msg = e.getMessage();     }          public R(LogicArgsException e) {         super();         this.state = e.getCode();         this.msg = e.getMessage();     }          public R(AccessDeniedException e) {         super();         this.state = SecurityConstants.ACCESS_DENIED;         this.msg = e.getMessage();     }          public R(NotBreakerException e) {         super();         this.state = e.getCode();         this.msg = e.getMessage();     }          public R(Throwable e) {         super();         if(InfoUtils.isContain(e.getMessage())) {             this.state = e.getMessage();             this.msg = InfoUtils.getInfo(this.state);         } else {                         this.state = CommonConstants.FAIL;             this.msg = InfoUtils.getInfo(FirstException.ERROR_CODE);         }     }               public R success(T obj){         this.state = CommonConstants.SUCCESS;         this.obj = obj;         return this;     }          public R error(String msg){         this.state = CommonConstants.FAIL;         this.msg = msg;         return this;     }          public R error(){         this.state = CommonConstants.FAIL;         this.msg = InfoUtils.getInfo(FirstException.ERROR_CODE);         return this;     }          @JSONField(serialize = false)     @JsonIgnore     public Boolean getIsSuccess() {         return Objects.equal(CommonConstants.SUCCESS, this.state);     }          public String toJson() {         return JSON.toJSONString(this);     } }
  经过以上的方式我们就可以做成一个全局的统一响应的封装。 ControllerAdvice
  这样我们已经知道ControllerAdvice的一个应用场景,是结合ResponseBodyAdvice进行使用的,同样我们也可以将ControllerAdvice的应用到其他场景。比如:统一异常处理,全局数据绑定,全局数据处理(上面的可以算成这个场景)。 /**  * user:kay三石  * time: 8:44  * desc: 公共的异常处理类  **/ @ControllerAdvice public class BaseExceptionHandler {     @ExceptionHandler(Exception.class)     @ResponseBody     public BaseResult error(Exception e) {         e.printStackTrace();         System.out.println("调用了公共异常处理类");         return BaseResult.notOk(e.getMessage());     } }
  当然我们也可以通过这两个结合做一些其他方面的实现,其他的可以自行去查阅资料进行使用。这里我们主要是说的ResponseBodyAdvice和@ControllerAdvice的一起使用返回统一的响应格式。
快上车某东自营显卡正在福利,此时不上更待何时?山外青山楼外楼,电脑问题找雨星,大家好我是雨星。今天雨星给打击推荐一款1000以下的显卡车,这里说的都是某东自营,在送货速度和售后等方面还是有很大优势的。它就是这个阶段千元左右的最2020年初,5G性价比旗舰,你的选择是什么?好久不见,甚是想念,大家好我是五星。正如大家所见,2020年是5G爆发的一年,虽然出现了一点小状况,但是大家对于5G的渴望还是那么高,那么3000到4000左右的5G手机你会选择哪小伙给大家带来一点小福利,美味的杏子味道如何?山外青山楼外楼,电脑问题找雨星,大家好我是雨星。雨星是一个地道的北方人,在雨星家乡可是很多杏樱桃桃子和柿子的生产地,现在的季节正是樱桃和杏子成熟的时机,雨星觉得很多朋友尤其是南方的汽车加速能力是由功率决定还是扭矩决定?扭矩与加速有哪些关系?汽车的加速性能是由功率决定还是由扭矩决定?这个问题一直被很多车友所讨论,产生的争议也一直不断那么汽车的加速度到底是由功率决定还是扭矩决定?其实答案很简单,汽车的加速性能是由功率决定德系发动机与日系发动机存在哪些差异,谁更好?德系车与日系车是现如今汽车市场中的两大主流,两个车系也各有各自的受众群体而围绕两个车系谁更强的博弈也从来没有停止过!相信很多车友都曾疑惑,德系车日系车在发动机甚至整车技术上谁更强?车身越来越大心脏越来越小,小排量发动机为何逐渐成为主流?回忆过往的十几年间,汽车似乎正在朝着车身不断增大而排量不断降低趋势发展,就像现如今的奥迪a6宝马5系的规格,几乎与20年前的奥迪a8宝马7系接近,但车子的发动机却以肉眼可见的速度缩曾经很小众化的双离合变速器为何在十几年间逐渐普及?每当谈起双离合变速器时朋友们首先想到的一定是大众,对于双离合变速器的普及方面,大众的确功不可没!早在2003年大众推出了第一款配备双离合的车型,高尔夫最强版本R32,从此掀起了双离永远年轻永远热泪盈眶!小鹏P5在线为生活增添热情保鲜剂五十岁的人还能做什么?浑浑噩噩地混日子,等待退休到来?提前过上养老生活,象棋麻将广场舞?NO!披荆斩棘的哥哥告诉我们,年龄只不过是一个符号,五十七岁的黄贯中五十五岁的林志炫五十四岁新车磨合后油耗真的下降么,为何有些车子磨合后油耗反而增加?刚入手的新车需要磨合相信很多车友都清楚这一点,虽然现如今的造车工艺装配工艺比过去提高了许多,所以车辆磨合的要求也不像过去那般苛刻但磨合过程依然是需要的车辆在磨合之后油耗会下降动力会积碳是如何产生的,发动机内部的积碳该如何清理?发动机积碳绝对算是老生常谈的问题,由于现如今很多车友爱车心切总担心车辆出现问题,所以难免对于积碳问题过于重视甚至把发动机积碳妖魔化?下面鄙人将详细阐述积碳的产生,以及该如何用理性的英国为何把罗孚捷豹路虎阿斯顿马丁等汽车品牌都出售了?众所周知英国的汽车技术发达,对汽车的理解以及底蕴也非常深厚,那为什么现如今的英国却出售掉了自家绝大部分汽车品牌?相信很多车友都会有这方面的疑惑,既然英国汽车技术强大又为何放弃汽车的
奔驰最贵纯电SUV内饰曝光!采用1。4米中控屏,4月19日将正式发布车东西(公众号chedongxi)作者地途编辑木米车东西3月16号消息,据外媒报道,奔驰公布了EQSSUV内饰,据悉此款车是迄今为止奔驰最大的电动SUV,预计将于4月19日全球首发你只管舒适,它负责开车理想One上门试驾体验到底如何?前言大家好,我是数据里奥斯,作为一个高精度定位行业的从业者和新能源车爱好者,2021款理想One作为小鹏P7之后又一款支持高精度定位服务的热销新能源车型,当然值得我去关注一下。最近用软件做亚马逊跟卖的优势在哪里,详细分享干货可以说亚马逊的跟卖制度,给很想要在亚马逊市场赚钱但是缺乏资金和技术的人打开了一扇窗。越来越多的个人和公司都开始在做跟卖,或者从铺货市场转型到跟卖市场,创造了很多大卖神话。我身边就有2022年值得关注的9个最新Java趋势尽管Java已经存在了25年,但每天都有新的Java开发趋势出现。在您的下一个Java项目中采用这些趋势将确保您与现代消费者保持同步。1。开发运维DevOps或开发人员运营是软件开彻底搞懂Python中的import与fromimport对不少Python初学者来说,Python导入其他模块的方式让他们很难理解。什么时候用importxxx?什么时候用fromxxximportyyy?什么时候用fromxxx。yyi312100F相当于几代i5?i312100F和i510400F处理器对比评测intel第12代酷睿新型号陆续上架,相信大家更关心的12代型号就是i512400F和i312100F这两款CPU,从售价上来看,i312100F和历代i510400F价格很相似,红米k50发布千呼万唤始出来,3月17号晚,红米k50终于和大家见面,这次发布会卢总带来三款手机产品红米k50红米k50pro和打脸的以前说没有的红米k40s!红米k50pro,之前取消了pro靠优质服务留住共享用户共享经济近年来蓬勃发展,给人们的生产生活带来许多方便。不过由于产品质量服务品质等方面参差不齐,共享经济领域的消费投诉商务纠纷时有发生,制约了其韧性和潜力的发挥。国家信息中心前不久发新东方转型电商直播,并不丢人也无可厚非来论双减政策的出台,教培行业,面临转型局面,作为教培行业龙头的新东方也不例外。本月初俞敏洪在社交媒体上表示,新东方将停止义务教育阶段校外培训的K9服务,捐赠近8万套崭新的课桌椅到偏战争中可以释放大量廉价简易无人机,去消耗敌方的防空力量吗?前几年网络上有一部电影天使陷落中开场就有一场火爆的动作场景,在整个场景中摩根弗里曼饰演的美国总统在野外度假过程中,就遭遇了几百个小型无人机组成的无人机集群大规模自杀式攻击。整个场景编程语言的本质是什么?作者神说要有光zxg来源神说要有光zxg本文转载自微信公众号神说要有光zxg,作者说要有光zxg。转载本文请联系神说要有光zxg公众号。作为程序员,我们会接触到各种各样的语言我们会