springboot异常,通用返回封装

spring mvc给我们提供了一个@RestControllerAdvice来增强所有@RestController,然后使用@ExceptionHandler注解,就可以拦截到对应的异常。

复制代码
@RestControllerAdvice
public class ControllerExceptionAdvice {

    @ExceptionHandler({BindException.class})
    public ResultVo MethodArgumentNotValidExceptionHandler(BindException e) {
        // 从异常对象中拿到ObjectError对象
        ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
        return new ResultVo(ResultCode.VALIDATE_ERROR, objectError.getDefaultMessage());
    }
}
复制代码

Lombok的@SneakyThrows就是为了消除这样的模板代码,使用注解后不需要担心Exception的处理

复制代码
import lombok.SneakyThrows;

public class SneakyThrowsExample implements Runnable {
  @SneakyThrows(UnsupportedEncodingException.class)
  public String utf8ToString(byte[] bytes) {
    return new String(bytes, "UTF-8");
  }
  
  @SneakyThrows
  public void run() {
    throw new Throwable();
  }
}
复制代码

 

复制代码
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

@RestControllerAdvice(
    annotations = {RestController.class},
    basePackageClasses = {HandlerInterceptor.class, Filter.class, Servlet.class}
)
@Slf4j
public class GlobalResultHandler implements ResponseBodyAdvice<Object> {
    @Value("${global.result.exclude.uri:/v3/api-docs/**}")
    private List<String> uris;

    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        if (returnType.getDeclaringClass().isAnnotationPresent(IgnoreResponse.class)) {
            return false;
        } else {
            return !((Method)Objects.requireNonNull(returnType.getMethod())).isAnnotationPresent(IgnoreResponse.class);
        }
    }

    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        HttpServletRequest servletRequest = ((ServletServerHttpRequest)request).getServletRequest();
        String contextPath = servletRequest.getContextPath();
        if (this.uriContains(StrUtil.removePrefix(servletRequest.getRequestURI(), contextPath))) {
            return body;
        } else {
            response.getHeaders().add("Content-Type", "application/json");
            if (body instanceof BaseResultDto) {
                return body;
            } else if (returnType.getGenericParameterType().equals(String.class)) {
                JSONObject json = new JSONObject();
                json.set("code", 0);
                json.set("message", "success");
                json.set("data", body == null ? null : body.toString());
                return JSONUtil.toJsonStr(json);
            } else {
                return BaseResultDto.success(body);
            }
        }
    }

    private boolean uriContains(String currentUri) {
        if (this.uris.contains(currentUri)) {
            return true;
        } else {
            Iterator var2 = this.uris.iterator();

            String uri;
            do {
                if (!var2.hasNext()) {
                    return false;
                }

                uri = (String)var2.next();
            } while(!StrUtil.endWith(uri, "**") || !StrUtil.startWith(currentUri, StrUtil.removeSuffix(uri, "/**")));

            return true;
        }
    }
}
复制代码

 

posted @   KeepSmiling_me  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示