ResponseResultAdvice.java 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package com.alvin.advice;
  2. import com.alvin.annotation.ResponseResult;
  3. import com.alvin.common.entity.Result;
  4. import com.alvin.common.entity.ResultCode;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.core.MethodParameter;
  8. import org.springframework.http.MediaType;
  9. import org.springframework.http.converter.HttpMessageConverter;
  10. import org.springframework.http.server.ServerHttpRequest;
  11. import org.springframework.http.server.ServerHttpResponse;
  12. import org.springframework.web.bind.annotation.ControllerAdvice;
  13. import org.springframework.web.context.request.RequestContextHolder;
  14. import org.springframework.web.context.request.ServletRequestAttributes;
  15. import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
  16. import javax.servlet.http.HttpServletRequest;
  17. import java.lang.annotation.Annotation;
  18. /**
  19. * @Description 封装返回的数据
  20. * @Author 田云
  21. * @Date 2020/12/19 11:44
  22. * @Version 1.0
  23. */
  24. @ControllerAdvice
  25. public class ResponseResultAdvice implements ResponseBodyAdvice<Object> {
  26. /**
  27. * 请求中是否包含了 响应需要被包装的标记,如果没有,则直接返回,不需要重写返回体
  28. *
  29. * @param methodParameter
  30. * @param aClass
  31. * @return
  32. */
  33. @Override
  34. public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
  35. ResponseResult annotation = methodParameter.getMethod().getDeclaringClass().getAnnotation(ResponseResult.class);
  36. //先判断类上面有没有注释,再判断方法上有没有注释
  37. if (annotation == null) {
  38. annotation = methodParameter.getMethod().getAnnotation(ResponseResult.class);
  39. }
  40. return annotation == null ? false : true;
  41. }
  42. /**
  43. * 对 响应体 进行包装; 除此之外还可以对响应体进行统一的加密、签名等
  44. *
  45. * @param responseBody 请求的接口方法执行后得到返回值(返回响应)
  46. */
  47. @Override
  48. public Object beforeBodyWrite(Object responseBody, MethodParameter methodParameter,
  49. MediaType mediaType,
  50. Class<? extends HttpMessageConverter<?>> aClass,
  51. ServerHttpRequest serverHttpRequest,
  52. ServerHttpResponse serverHttpResponse) {
  53. //自定义的错误异常
  54. if (responseBody instanceof ResultCode) {
  55. ResultCode code = (ResultCode) responseBody;
  56. if (code == ResultCode.SUCCESS) {
  57. return Result.success();
  58. } else {
  59. return Result.failure(code);
  60. }
  61. }
  62. return Result.byObject(responseBody);
  63. }
  64. }