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; } } }
我只想安静地学习,捡拾前人的牙慧,默默强大如此弱小的我...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通