@ControllerAdvice:全局异常处理示例

全局异常处理

用@ControllerAdvice标记全局异常处理的类

项目地址:https://github.com/zz790609619/LeetCodeRecord.git

@ControllerAdvice
这是一个增强的 Controller标签。使用这个 ControllerAdvice,可以实现三个方面的功能:

  1. 全局异常处理
  2. 设置全局变量,也就是设置完,每个接口能获取到整个参数
  3. 数据预处理

@ControllerAdvice修饰的类

package com.example.demo.config;

import com.example.demo.entity.model.ResponseDto;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class GlobalControllerAdvice {
    /**
     * 所有异常处理
     * @param request
     * @param e
     * @return
     * @throws Exception
     */
    @ExceptionHandler(value = Exception.class)
    public @ResponseBody
    ResponseDto exceptionHandler(HttpServletRequest request,Exception e)throws Exception{
        ResponseDto dto=new ResponseDto();
        dto.setErrorCode(1001);
        dto.setMessage("Exception:"+e.getMessage());
        return dto;
    }

    /**
     * 空指针异常处理
     * @param request
     * @param e
     * @return
     * @throws NullPointerException
     */
    @ExceptionHandler(value = NullPointerException.class)
    public @ResponseBody
    ResponseDto exceptionHandler(HttpServletRequest request,NullPointerException e)throws NullPointerException{
        ResponseDto dto=new ResponseDto();
        dto.setErrorCode(1002);
        dto.setMessage("NullPointerException:"+e.getMessage());
        return dto;
    }

    /**
     * 全局变量
     * @return
     */
    @ModelAttribute(name="ww")
    public Map<String,Object> globalData() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("ww", "helloQ");
        return map;
    }

    /**
     * 数据预处理
     * @param binder
     */
    @InitBinder("helloA")
    public void b(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("helloA.");
    }
    @InitBinder("helloB")
    public void a(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("helloB.");
    }

}

使用场景:

package com.example.demo.controller;

import com.aliyun.openservices.shade.com.alibaba.fastjson.JSON;
import com.example.demo.entity.model.ResponseDto;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping(value = "/test")
public class UserNodeController {
    @RequestMapping(value = "/index")
    public String index(){
        return "/index";
    }

    /**
     * 异常报错
     * 访问路径:http://127.0.0.1:8090/test/exception
     * 不走全局处理类结果:{"message": "NoEnterGlobalException" }
     * 最后返回结果: {"errorCode": 1001,"message": "Exception:4","data": null }
     */
    @RequestMapping(value = "/exception")
    public ResponseDto getException(){
        int[] arr = {1, 2, 3};
        System.out.println(arr[4]);
        ResponseDto dto=new ResponseDto();
        dto.setMessage("NoEnterGlobalException");
        return dto;
    }
    /**
     * 空指针异常报错
     * 访问路径:http://127.0.0.1:8090/test/nullPointException
     * 不走全局处理类结果:{"message": "NoEnterGlobalNullPointException" }
     * 最后返回结果:{"errorCode": 1002,"message": "NullPointerException:null","data": null }
     */
    @RequestMapping(value = "/nullPointException")
    public ResponseDto getNullPointException(){
        Object obj = null;
        obj.toString();
        ResponseDto dto=new ResponseDto();
        dto.setMessage("NoEnterGlobalNullPointException");
        return dto;
    }
    /**
     * 获取全局变量
     * 访问路径:http://127.0.0.1:8090/test/getGlobalParm
     * 返回结果:{"ww":{"ww":"helloQ"}}
     */
    @RequestMapping(value = "/getGlobalParm")
    public String getGlobalParm(Model model){
        Map<String, Object> map = model.asMap();
        return JSON.toJSONString(map);
    }

    /**
     * 获取预处理后的数据
     * 访问地址及参数:http://127.0.0.1:8090/test/getPreprocessedData?helloA.errorCode=1&helloA.message=a&helloA.data=a&helloB.errorCode=2&helloB.message=b&helloB.data=b
     * 返回结果:dtoA:{"data":"a","errorCode":1,"message":"a"},dtoB:{"data":"b","errorCode":2,"message":"b"}
     */
    @RequestMapping(value = "/getPreprocessedData")
    public String getPreprocessedData(@ModelAttribute("helloA")ResponseDto dtoA,@ModelAttribute("helloB")ResponseDto dtoB){
        return "dtoA:"+JSON.toJSONString(dtoA)+",dtoB:"+JSON.toJSONString(dtoB);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果不想使用@ControllerAdvice注解,我们也可以通过实现HandlerExceptionResolver接口来实现全局异常处理。具体步骤如下: 1. 创建一个类,实现HandlerExceptionResolver接口。 2. 在类中实现resolveException方法,该方法会在全局异常发生时被执行。 3. 在resolveException方法中,我们可以根据不同的异常类型进行不同的处理,比如返回自定义错误信息或者跳转到指定页面。 4. 最后,我们需要将该类注册到Spring框架中,可以通过在配置文件中进行配置或者使用注解的方式进行注册。 以下是一个简单的示例: ```java public class GlobalExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 返回自定义错误信息 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("errorMsg", "系统错误,请稍后重试!"); modelAndView.setViewName("error"); return modelAndView; } } ``` 在上述代码中,我们实现了HandlerExceptionResolver接口并重写了resolveException方法。在该方法中,我们将错误信息存入ModelAndView中,并将viewName设置为"error",表示跳转到error页面显示错误信息。 最后,我们需要将该类注册到Spring框架中。可以通过在配置文件中进行配置或者使用注解的方式进行注册。例如,在Spring配置文件中添加如下配置: ```xml <bean id="globalExceptionHandler" class="com.example.GlobalExceptionHandler"/> ``` 在上述配置中,我们将GlobalExceptionHandler类注册为Spring的一个bean,并使用该类处理全局异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值