06SpringBoot中 @ControllerAdvice注解(全局异常处理)与@ModelAttribute的使用

Posted 小楼夜听雨QAQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了06SpringBoot中 @ControllerAdvice注解(全局异常处理)与@ModelAttribute的使用相关的知识,希望对你有一定的参考价值。

说明:不够详细,只是列举了常见的使用方法,如果需要详细的说明,可以参考下面的博客:

01、SpringBoot优雅的全局异常处理

02、@ModelAttribute注解的使用总结

 

1、@ControllerAdvice

@ControllerAdvice主要和@ExceptionHandler结合使用,可以达到全局异常处理的目的,如下:

@ControllerAdvice
public class ExceptionHandlerController {

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public RestResult handlerException(HttpServletRequest request,Exception e){

        RestResult restResult = new RestResult();
        restResult.setCode(200);
        restResult.setData("hello");
        restResult.setMsg("123");
        return restResult;

    }
}

可以接收全局代码抛出来的异常,包括过滤器等一些非Controller抛出来的异常。

当然,如果不想全局处理,只要处理某一个Controller,也可以这么做:

在该Controller下定义

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public RestResult handlerException(HttpServletRequest request,Exception e){

        RestResult restResult = new RestResult();
        restResult.setCode(200);
        restResult.setData("hello");
        restResult.setMsg("123");
        return restResult;

    }

@ExceptionHandler可以处理所在Controller任意方法抛出来的异常,包括其所在类的子类(可以继承)。

但是需要注意的时,某种情况下,并不好用,例如:

@RestController
public class FileUploadController{

    SimpleDateFormat formatter = new SimpleDateFormat("/yyyy/MM/dd/");
    @RequestMapping("/upload")
    public String fileUpload(MultipartFile file, HttpServletRequest request){

        String time = formatter.format(new Date());
        //图片上传服务器后所在的文件夹
        String realPath = request.getServletContext().getRealPath("/img") + time;
        File folder = new File(realPath);
        if(!folder.exists())
            folder.mkdirs();

        //通常需要修改图片的名字(防止重复)
        String oldName = file.getOriginalFilename();
        String newName = UUID.randomUUID() + oldName.substring(oldName.lastIndexOf("."));

        try {
            //将文件放到目标文件夹
            file.transferTo(new File(folder, newName));

            //通常还需要返回图片的URL,为了通用性,需要动态获取协议,不要固定写死
            String returnUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/img" + time + newName;
            return returnUrl;
        } catch (IOException e) {
            e.printStackTrace();
        }


        return null;
    }


    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public RestResult handlerException(HttpServletRequest request,Exception e){

        RestResult restResult = new RestResult();
        restResult.setCode(200);
        restResult.setData("hello");
        restResult.setMsg("123");
        return restResult;

    }
}

如果没有配置文件上传大小,传大文件的时候会出错。这个时候抛出来的异常就不能被@ExceptionHandler处理,因为这个异常不是Controller抛出来的。追踪异常栈:

 

 

 

 

发现是从Spring对于文件操作请求的解析类抛出来的异常(最底层还是过滤器),这种异常就不会被处理。

所以如果要实现全局异常处理的功能,最好还是配合@ControllerAdvice注解来使用。

2、@ModelAttribute

主要作用是向Model里面添加数据,以便在视图显示。用法比较多,结合不同的注解使用的时候,会有不同的含义。但是因为现在大多数都是前后端分离的项目,个人来说,还没怎么遇到过,就不做过多研究,留下一个链接供日后参考:

https://blog.csdn.net/leo3070/article/details/81046383

 

以上是关于06SpringBoot中 @ControllerAdvice注解(全局异常处理)与@ModelAttribute的使用的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot中Controller的使用

SpringBoot篇 - Controller中常用的注解简介

SpringBoot--springboot启动类和controller的配置

Springboot项目启动后访问不到Controller

springboot启动后访问不到controller

项目中遇到的问题00000--springboot扫描Controller问题