栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

微服务异常处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

微服务异常处理

异常处理切入点布局如下:

一、网关层
@RestController
public class ErrorHandlerController implements ErrorController {
    private final ErrorAttributes errorAttributes;

    @Autowired
    public ErrorHandlerController(ErrorAttributes errorAttributes) {
 this.errorAttributes = errorAttributes;
    }

    
    @Override
    public String getErrorPath() {
 return "/error";
    }

    @RequestMapping("/error")
    public Object error(HttpServletRequest request, HttpServletResponse response) {
 WebRequest webRequest = new ServletWebRequest(request);
 Map errorAttributes = this.errorAttributes.getErrorAttributes(webRequest, true);
 String msg = errorAttributes.getOrDefault("message", "not found").toString();
 String code = errorAttributes.getOrDefault("code", 404).toString();
 if (AuthExceptionEnum.TOKEN_EXPIRE.getCode().toString().equals(code)) {
     response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
 }
 return ResponseData.error(Integer.valueOf(code), msg);
    }
 @Bean
 public AbstractTokenValidService jwtTokenValidServiceImpl(){
     return new JwtAbstractTokenValidServiceImpl();
 }

 private class NosErrorAttributes extends DefaultErrorAttributes {

 @Override
 public Map getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
     RequestContext currentContext = RequestContext.getCurrentContext();
     Throwable throwable = currentContext.getThrowable();
     if (throwable instanceof ZuulException) {
  ZuulException zuulException = (ZuulException) throwable;
  Throwable cause = zuulException.getCause();
  if (cause instanceof ServiceException) {
      ServiceException serviceException = (ServiceException) cause;
      return BeanUtil.beanToMap(ResponseData.error(serviceException.getCode(), serviceException.getMessage()));
  }
     }

     return BeanUtil.beanToMap(ResponseData.error(CoreExceptionEnum.SERVICE_ERROR.getCode(), CoreExceptionEnum.SERVICE_ERROR.getMessage()));
 }
    }
二、Feign
@Component
public class FeignErrorDecoder implements ErrorDecoder {
    @Override
    public Exception decode(String methodKey, Response response) {
 
 String responseBody;
 try {
     if (response == null || response.body() == null) {
  if (response != null && response.status() == 404) {
      return new ServiceException(CoreExceptionEnum.REMOTE_SERVICE_NULL);
  } else {
      return new ServiceException(CoreExceptionEnum.SERVICE_ERROR);
  }
     }
     responseBody = IoUtil.read(response.body().asInputStream(), "UTF-8");

 } catch (IOException e) {
     return new ServiceException(CoreExceptionEnum.IO_ERROR);
 }

 
 JSonObject jsonObject = JSONObject.parseObject(responseBody);


 Integer code = jsonObject.getInteger("code");
 String message = jsonObject.getString("message");
 if (ToolUtil.isEmpty(message)) {
     message = CoreExceptionEnum.SERVICE_ERROR.getMessage();
 }

 if (code == null) {
     Integer status = jsonObject.getInteger("status");
     if (status == null) {
  return new ServiceException(CoreExceptionEnum.SERVICE_ERROR.getCode(), message);
     } else {
  return new ServiceException(status, message);
     }
 } else {
     return new ServiceException(code, message);
 }

    }
}

三、微服务
@ControllerAdvice
@Slf4j
public class DefaultExceptionHandler {
    
    @ExceptionHandler(ServiceException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ResponseData notFount(ServiceException e) {
 log.info("业务异常:", e);
 return ResponseData.error(e.getCode(), e.getErrorMessage());
    }

    
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ResponseData serverError(Exception e) {
 log.error("运行时异常:", e);
 return ResponseData.error(CoreExceptionEnum.SERVICE_ERROR.getCode(), CoreExceptionEnum.SERVICE_ERROR.getMessage());
    }
}
附: SpringBoot默认异常处理器

BasicErrorController

    @RequestMapping(
 produces = {"text/html"}
    )
    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
 HttpStatus status = this.getStatus(request);
 Map model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML)));
 response.setStatus(status.value());
 ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
 return modelAndView != null ? modelAndView : new ModelAndView("error", model);
    }
  @RequestMapping
    @ResponseBody
    public ResponseEntity> error(HttpServletRequest request) {
 Map body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL));
 HttpStatus status = this.getStatus(request);
 return new ResponseEntity(body, status);
    }
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号