当前位置: 首页 > news >正文

网站建设应用权限海南省城乡住房建设厅网站首页

网站建设应用权限,海南省城乡住房建设厅网站首页,企业网站源码挣钱吗,郑州网站定制外包起因 关于使用AOP去实现统一返回接口在之前的博客中我们已经实现了,但我突然突发奇想,SpringBoot中异常类的统一返回好像是通过RestControllerAdvice 这个注解去完成的,那我是否也可以通过这个注解去实现统一返回接口。 正文 这个方法主要…

起因

关于使用AOP去实现统一返回接口在之前的博客中我们已经实现了,但我突然突发奇想,SpringBoot中异常类的统一返回好像是通过@RestControllerAdvice 这个注解去完成的,那我是否也可以通过这个注解去实现统一返回接口。

正文

这个方法主要是通过@ControllerAdvice + ResponseBodyAdvice实现统一返回结果。其实本质来说和aop实现是相通的明白一个另一个就非常好理解了。
(Result 的代码我就不在这边重复贴了,读者可以去我直接用AOP实现的博客中拿)

自定义注解

import com.study.project.common.BaseResponse;
import com.study.project.common.ResultCode;import java.lang.annotation.*;import static com.study.project.common.ResultCode.SUCCESS;/*** @date 2023/2/18*/
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FunctionResult {String value() default "";//默认code为成功ResultCode code() default SUCCESS;
}

自定义一个响应拦截

import com.study.project.annotation.FunctionResult;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import java.lang.annotation.Annotation;
import java.lang.reflect.Method;/*** @author Chengming.Zhang* @date 2023/2/18* ResponseBodyAdvice主要是对加了@RestController(也就是@Controller+@ResponseBody)注解的处理器将要返回的值进行增强处理。*其实也就是采用了AOP的思想,对返回值进行一次修改。*/
@RestControllerAdvice
public class FunctionResponseBodyAdvice implements ResponseBodyAdvice  {//判断当前类上是否有@FunctionResultprotected boolean isFunctionResult(MethodParameter returnType) {/*** getContainingClass() 获取当前类的信息* isAnnotationPresent 判断当前类上是否存在某个注解*/Class<?> containingClass = returnType.getContainingClass();boolean annotationPresent = containingClass.isAnnotationPresent(FunctionResult.class);Annotation[] annotations = containingClass.getAnnotations();return returnType.getContainingClass().isAnnotationPresent(FunctionResult.class);}@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return isFunctionResult(returnType);}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {Method method = returnType.getMethod();Class<?> methodReturnType = method.getReturnType();//判断是否为void的方法if (methodReturnType.equals(void.class)) {return body;}//判断当前方法是否有@FunctionResult注解,如果没有则全部按照成功返回,如果有则根据具体指定的返回码以及返回内容返回FunctionResult result = returnType.getMethod().getAnnotation(FunctionResult.class);if (result == null) {return new BaseResponse(ResultCode.SUCCESS, body);}ResultCode code = result.code();return new BaseResponse(result.code(), body);}
}

controller类

import com.study.project.annotation.FunctionResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** @date 2023/2/4*/
@FunctionResult
@RestController
public class TestController {@RequestMapping("/test5")public int test5(){return 1;}@RequestMapping("/test6")public void test6(){System.err.println("test6");}
}

测试
在这里插入图片描述
在这里插入图片描述

你是不是以为代码已经结束?
其实这个代码是有问题hhhhh,当接口的返回类型是String的时候就会提示报错
在这里插入图片描述
看控制台的报错信息发现是接口的返回参数转换的时候报错了,于是我们根据控制台上的报错信息进行断点排查

首先我们找到控制台中的第一行的报错类StringHttpMessageConverter.java中的addDefaultHeaders方法,发这个方法其实是重新了他父类的AbstractHttpMessageConverter的方法

在这里插入图片描述
在这里插入图片描述
AbstractHttpMessageConverter中的方法Result的参数是T,但是StringHttpMessageConverter在重写的时候将其转为了String,因此当ResponseBodyAdvice返回Result格式的时候就会报错,所以我们就需要在ResponseBodyAdvice中需要单独处理一下String类型。

完整代码

import cn.hutool.json.JSONUtil;
import com.study.project.annotation.FunctionResult;
import jdk.nashorn.internal.objects.annotations.Function;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import java.lang.annotation.Annotation;
import java.lang.reflect.Method;/*** @author Chengming.Zhang* @date 2023/2/18* ResponseBodyAdvice主要是对加了@RestController(也就是@Controller+@ResponseBody)注解的处理器将要返回的值进行增强处理。*其实也就是采用了AOP的思想,对返回值进行一次修改。*/
@RestControllerAdvice
public class FunctionResponseBodyAdvice implements ResponseBodyAdvice  {//判断当前类上是否有@FunctionResultprotected boolean isFunctionResult(MethodParameter returnType) {/*** getContainingClass() 获取当前类的信息* isAnnotationPresent 判断当前类上是否存在某个注解*/Class<?> containingClass = returnType.getContainingClass();boolean annotationPresent = containingClass.isAnnotationPresent(FunctionResult.class);Annotation[] annotations = containingClass.getAnnotations();return returnType.getContainingClass().isAnnotationPresent(FunctionResult.class);}@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return isFunctionResult(returnType);}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {Method method = returnType.getMethod();Class<?> methodReturnType = method.getReturnType();if (methodReturnType.equals(void.class)) {return body;}//判断当前方法是否有@FunctionResult注解,如果没有则全部按照成功返回,如果有则根据具体指定的返回码以及返回内容返回FunctionResult result = returnType.getMethod().getAnnotation(FunctionResult.class);if (result == null) {if (body instanceof String) {return JSONUtil.toJsonStr(new BaseResponse(ResultCode.SUCCESS, body));}return new BaseResponse(ResultCode.SUCCESS, body);}if (body instanceof String) {return JSONUtil.toJsonStr(new BaseResponse(result.code(), body));}return new BaseResponse(result.code(), body);}
}
http://www.yayakq.cn/news/786784/

相关文章:

  • 网站导航自适应专业刷单网站建设
  • 各大网站代下单怎么做中国互联网协会是什么单位
  • 淮南电商网站建设费用店铺设计网站推荐
  • asp网站转html怎样做站长建网站
  • 中学加强校园网站建设建设咖啡厅网站的意义
  • wordpress 自学网重庆旅游seo整站优化
  • 网站建设中左对齐网站建设与管理实践报告总结
  • 唐山长城网站建设做梯子的企业网站
  • 松阳建设网站装个宽带多少钱
  • 企业网站的总体设计dw怎么把代码做成网页
  • 济南响应式网站开发wordpress字段添加按钮
  • 网站优化哪家专业微信网站怎么做下载附件
  • 企业网站和域名的好处神经网络跟网络架构
  • 企业网站seo优化公司网站 科技感
  • iis网站服务器安全隐患新网站应该怎么做
  • 举报网站建设情况总结网站qq 微信分享怎么做
  • html 路径 网站根路径网络规划设计师教程第2版pdf下载
  • 怎么做网站教程 用的工具wordpress怎么设计主题
  • 网站开发一般流程wordpress 添加链接
  • 网站建设公司好吗优秀网站开发商
  • win7建网站教程杭州网络网站建设
  • 网站设计的分辨率做系统网站信息检索网站
  • 济南网站建设市场wordpress浏览统计
  • 做粘土网站wordpress商业模板
  • 做视频网站注意什么做服务器的网站都有哪些功能
  • 外贸网站开发推荐影楼修图用什么软件
  • 百度地图怎么放在网站上成品免费的视频软件有哪些好用点
  • 360免费建站官网入口长治软件制作平台
  • 威海网站定制公司网站.可以自己做吗
  • 栖霞建设采购网站asp最新版本