1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package com.simuwang.deploy.config;
- import cn.hutool.json.JSONUtil;
- import com.simuwang.base.ano.ExcludeGlobalResult;
- import com.smppw.common.pojo.ResultVo;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.core.MethodParameter;
- import org.springframework.http.HttpStatus;
- import org.springframework.http.HttpStatusCode;
- import org.springframework.http.MediaType;
- import org.springframework.http.ResponseEntity;
- import org.springframework.http.converter.HttpMessageConverter;
- import org.springframework.http.server.ServerHttpRequest;
- import org.springframework.http.server.ServerHttpResponse;
- import org.springframework.lang.NonNull;
- import org.springframework.web.bind.annotation.RestControllerAdvice;
- import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
- import java.lang.reflect.AnnotatedElement;
- /**
- * @author wangzaijun
- * @date 2023/8/12 16:39
- * @description 全局的结果处理工具
- */
- @RestControllerAdvice
- public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {
- private final Logger logger = LoggerFactory.getLogger(this.getClass());
- @Override
- public boolean supports(@NonNull MethodParameter returnType, @NonNull Class<? extends HttpMessageConverter<?>> converterType) {
- AnnotatedElement element = returnType.getAnnotatedElement();
- // 除了被ExcludeGlobalResult标记的方法其他全部接口都要拦截
- return !element.isAnnotationPresent(ExcludeGlobalResult.class);
- }
- @Override
- public Object beforeBodyWrite(Object body, @NonNull MethodParameter returnType, @NonNull MediaType selectedContentType,
- @NonNull Class<? extends HttpMessageConverter<?>> selectedConverterType,
- @NonNull ServerHttpRequest request, @NonNull ServerHttpResponse response) {
- if (body instanceof String) {
- // 当响应体是String类型时
- response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
- return JSONUtil.toJsonStr(ResultVo.ok(body));
- }
- if (body instanceof ResultVo<?>) {
- // 已经包装过的结果无需再次包装
- return body;
- }
- if (body instanceof ResponseEntity<?> entity) {
- HttpStatusCode statusCode = entity.getStatusCode();
- if (statusCode.value() == HttpStatus.OK.value()) {
- return ResultVo.ok(entity.getBody());
- }
- this.logger.warn("全局统一数据返回,接口{} 请求错误\n{}", request.getURI(), body);
- return ResultVo.fail(statusCode.value(), "接口请求错误");
- }
- // 对响应体进行包装
- return ResultVo.ok(body);
- }
- }
|