Spring 全局异常拦截根据业务返回不同格式数据 自定义异常

1.全局异常拦截:针对所有异常进行拦截 可根据请求自定义返回格式

2.自定义异常类 处理不同业务的异常

接下来开始入手代码:

1).自定义异常类

@ControllerAdvice//添加注解 记得开启spring的全局扫描
public class BusinessException extends RuntimeException {
    private static final long serialVersionUID = 2332608236621015980L;


    private String code;
    public BusinessException(String code,String message) {
        super(message);
        this.code = code;
    }

    public BusinessException() {
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

 

2).全局异常处理器(对拦截到的异常进行分类处理)

/**
 * 全局异常处理器
 * @author chenhao
 */
public class BusinessExceptionResolver implements HandlerExceptionResolver {
    /**日志log*/
    private static Logger log = LoggerFactory.getLogger(BusinessExceptionResolver.class);

    //系统抛出的异常
    @Override
    public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response, Object handler, Exception ex) {
        //handler就是处理器适配器要执行的Handler对象(只有method)
        //解析出异常类型。
        /*  使用response返回    */
        response.setStatus(HttpStatus.OK.value()); //设置状态码
        response.setContentType(MediaType.APPLICATION_JSON_VALUE); //设置ContentType
        response.setCharacterEncoding("UTF-8"); //避免乱码
        response.setHeader("Cache-Control", "no-cache, must-revalidate");
        //如果该 异常类型是系统 自定义的异常,直接取出异常信息。
        BusinessException businessException=null;
        try {
        //根据请求方式返回不同的格式(根据自己的业务需求实现,如果只返回一种格式的不用判断)
        //统一返回json 自定义了返回Result类 引入了Jackson
if ("application/json".equals(request.getContentType())){ if(ex instanceof BusinessException){ businessException = (BusinessException)ex; //错误信息 log.error(ex.getMessage(),ex); response.getWriter().write(Result.error(businessException.getCode(),ex.getMessage()).toString()); }else { log.error(ex.getMessage(),ex); response.getWriter().write(Result.error("-1", ex.getMessage()).toString()); } }else {
          //统一返回xml格式 Message message
= new Message(Constants.RESULT_FAIL); message.setScript(ex.toString()); response.setContentType("text/xml"); response.getWriter().write(XmlUtil.objectToString(message)); } } catch (IOException e) { log.error("与客户端通讯异常:"+ e.getMessage(), e); e.printStackTrace(); } ModelAndView modelAndView=new ModelAndView(); return modelAndView; } }

3).Spring配置文件添加

springMVC启动加载时会将所有的异常处理HandlerExceptionResolver实现类存放到handlerExceptionResolvers一个map结构中。

<bean id="exceptionResolver" class="com.*.exception.BusinessExceptionResolver"></bean>

4).使用方式(我这里只针对JSON)

返回格式:

json格式:

{
"success": false,
"errorcode": "10",
"errormsg": "特征值不能为空",
"data": null
}

xml格式:

<?xml version="1.0" encoding="UTF-8"?>
<Message code="00001" script="java.lang.NullPointerException" rowCount=""/>

目前知道的还可以定义很多异常来让框架简易。多学学总没错。

转载于:https://www.cnblogs.com/AmbitiousMice/p/9054399.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Gateway是一个基于Spring实现的微服务网关,它提供了一种灵活、强大的方式来构建、管理和路由微服务的请求流量。在使用Spring Cloud Gateway时,我们可以通过编写自定义的全局过滤器来实现全局拦截异常的功能。 要实现全局拦截异常,首先我们需要创建一个全局异常处理,该需要继承自AbstractGatewayExceptionHandler。在这个中,我们可以根据自己的需求重写相应的方法来处理异常。 比如,可以重写handleException方法来处理异常,并返回自定义的错误响应。在这个方法中,我们可以根据不同异常型进行不同的处理,比如返回特定的错误码、错误信息等。 然后,我们需要将这个全局异常处理注册到Spring Cloud Gateway中。在Java配置文件中,添加一个Bean,将全局异常处理的实例作为参数传入。 通过以上步骤,我们就可以实现Spring Cloud Gateway的全局拦截异常功能了。当微服务中出现异常时,系统会自动调用全局异常处理中的相应方法来处理异常,并返回自定义的错误响应。 总之,使用Spring Cloud Gateway可以方便地实现全局拦截异常的功能。我们只需要编写一个自定义的全局异常处理,并将其注册到Spring Cloud Gateway中即可。这样,我们就能够在微服务中统一处理各种异常,并返回自定义的错误信息。这样不仅提高了系统的可维护性,还可以提升用户的体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值