zoukankan      html  css  js  c++  java
  • 06、SpringBoot中 @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

  • 相关阅读:
    定位中方向余弦矩阵(DCM)简介
    前端UI框架小汇总
    前端知识点小结
    overflow兼容iOS
    使用Flexible实现手淘H5页面的终端适配
    获取当前Javascript脚本文件的路径
    Javascript中document.execCommand()的用法 ( 实现浏览器菜单的很多功能 )
    jquery中的map()方法与js中的map()方法
    js判断是否为移动端
    页面制作注意事项
  • 原文地址:https://www.cnblogs.com/phdeblog/p/13236619.html
Copyright © 2011-2022 走看看