GlobalResponseBodyAdvice.java 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package com.simuwang.deploy.config;
  2. import cn.hutool.json.JSONUtil;
  3. import com.simuwang.base.ano.ExcludeGlobalResult;
  4. import com.smppw.common.pojo.ResultVo;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.core.MethodParameter;
  8. import org.springframework.http.HttpStatus;
  9. import org.springframework.http.HttpStatusCode;
  10. import org.springframework.http.MediaType;
  11. import org.springframework.http.ResponseEntity;
  12. import org.springframework.http.converter.HttpMessageConverter;
  13. import org.springframework.http.server.ServerHttpRequest;
  14. import org.springframework.http.server.ServerHttpResponse;
  15. import org.springframework.lang.NonNull;
  16. import org.springframework.web.bind.annotation.RestControllerAdvice;
  17. import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
  18. import java.lang.reflect.AnnotatedElement;
  19. /**
  20. * @author wangzaijun
  21. * @date 2023/8/12 16:39
  22. * @description 全局的结果处理工具
  23. */
  24. @RestControllerAdvice
  25. public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {
  26. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  27. @Override
  28. public boolean supports(@NonNull MethodParameter returnType, @NonNull Class<? extends HttpMessageConverter<?>> converterType) {
  29. AnnotatedElement element = returnType.getAnnotatedElement();
  30. // 除了被ExcludeGlobalResult标记的方法其他全部接口都要拦截
  31. return !element.isAnnotationPresent(ExcludeGlobalResult.class);
  32. }
  33. @Override
  34. public Object beforeBodyWrite(Object body, @NonNull MethodParameter returnType, @NonNull MediaType selectedContentType,
  35. @NonNull Class<? extends HttpMessageConverter<?>> selectedConverterType,
  36. @NonNull ServerHttpRequest request, @NonNull ServerHttpResponse response) {
  37. if (body instanceof String) {
  38. // 当响应体是String类型时
  39. response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
  40. return JSONUtil.toJsonStr(ResultVo.ok(body));
  41. }
  42. if (body instanceof ResultVo<?>) {
  43. // 已经包装过的结果无需再次包装
  44. return body;
  45. }
  46. if (body instanceof ResponseEntity<?> entity) {
  47. HttpStatusCode statusCode = entity.getStatusCode();
  48. if (statusCode.value() == HttpStatus.OK.value()) {
  49. return ResultVo.ok(entity.getBody());
  50. }
  51. this.logger.warn("全局统一数据返回,接口{} 请求错误\n{}", request.getURI(), body);
  52. return ResultVo.fail(statusCode.value(), "接口请求错误");
  53. }
  54. // 对响应体进行包装
  55. return ResultVo.ok(body);
  56. }
  57. }