GlobalResponseBodyAdvice.java 2.5 KB

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