@ControllerAdvice

摘要:
@ControllerAdvice是@Controller注释的增强,它是Spring的一部分,可以处理全局异常。显然,接口是不友好的,因此我们可以使用@ControllerAdvice来执行全局异常处理、捕获异常并自定义返回的结果:packagecom。兹尔。例外importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.multipart.MaxUploadSizeExceedException;importjavax.servlet.http.HttpServletResponse;importjava.io.io异常;importjava.io.PrintWriter;@ControllerAdvicepublicclassMyAdviceException{//MaxUploadSizeExceedException,这是一个异常类。在这里可以枚举多个异常@ExceptionHandlerpublicvoidmyexcept{response.setContentType;PrintWriterwriter=null;try{writer=response.getWriter();}catch{ex.printStackTrace();writer.flush();writer.close();}访问页面结果:第二,让我们看一下预设的全局数据:预设数据意味着我们可以将全局数据设置为在任何控制器中都可用。

@ControllerAdvice是@Controller注解的一个增强,这个注解是Spring里面的东西,可以处理全局异常。当然在Spring Boot中也可以使用,但是Spring Boot中有它全自动化配置的异常处理,因为是全自动化的,因此也可以自己定制,比如定制它的异常页面,异常信息提示,异常视图。这里的话主要看一下,这个注解怎么用。它主要有一下几个功能:

  • 处理全局异常
  • 预设全局数据
  • 请求参数预处理

先看第一个全局异常的处理:

举个例子,比如做文件上传的时候,Spring Boot中默认的单个文件上传大小是1MB,如果我们将它改成1KB,我们看一下效果。@ControllerAdvice第1张

 @ControllerAdvice第2张

 显然这个界面是不友好的,那么我们可以用@ControllerAdvice做一个全局异常处理,去捕获这个异常,并定制我们返回的结果:

package com.zl.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.multipart.MaxUploadSizeExceededException;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@ControllerAdvice
public class MyAdviceException {
     //MaxUploadSizeExceededException,这个是异常类,这里可以枚举多个异常
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public void myexcept(MaxUploadSizeExceededException e, HttpServletResponse response){
         response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = null;
        try {
            writer = response.getWriter();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        writer.write("文件太大,请重新选择");
        writer.flush();
        writer.close();

    }
}

访问页面结果:

@ControllerAdvice第3张

 第二个我们看一下预设全局数据:

预设数据就是我们可以设置一个全局数据在任何的controller中都可以获取到。

package com.zl.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;

import java.util.HashMap;
import java.util.Map;
//全局预设数据
@ControllerAdvice
public class GlobalData {
    @ModelAttribute
    public Map<String,Object> mydata(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("name","zl");
        map.put("age","21");
        return map;

    }
}
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLOutput;
import java.util.Map;
import java.util.Set;
//在Controller中获取预设数据
@RestController
public class GlobalDataInfoController {
    @GetMapping("/data")
    public String data(Model model){
        Map<String, Object> map = model.asMap();
        Set<String> strings = map.keySet();
        for (String key : strings) {

            System.out.println(key+":"+map.get(key));
        }
        return "data";
    }
}

展示结果:

@ControllerAdvice第4张

 第三个看一下请求参数预处理:

这个的话,是由于开发者参数取名的时候有重名,一般很少遇到,但是如果遇到了,通过技术也可以解决。在这里就不做演示了。有兴趣的可以自己尝试。

免责声明:文章转载自《@ControllerAdvice》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IOS仿网易新闻客户端左右侧栏echarts图标legend全选功能添加下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

AirtestIDE基本功能(二)

文件菜单-相应工具栏上的前四个按钮:新建、打开、保存和另存为新。单击此按钮以选择是否使用创建脚本。air后缀或带有的脚本。py后缀。新脚本将初始化代码,以帮助您从API引入Airtest的各种接口,并自动初始化设备。你可以看到。air脚本文件实际上是一个公用文件夹,其中放置了通过IDE捕获的图像和运行日志。软件关闭时,布局信息将自动保存。(3) 选项-设置设...

virtuoso数据库的安装方法

数据库虚拟师有两种安装和配置方法。第一种方法是默认情况下直接在系统中安装virtualoso,复制virtualoso的安装文件,然后默认情况下将其直接安装。使用命令行对virtualoso数据库进行操作。1将virtualoso opensource解压缩到指定目录。例如,c:virtualoso2安装VC++2012和VC++2010插件补丁3以设置环境...

国产操作系统——银河麒麟V10 SP1使用小结

几天前,我看了国内操作系统Galaxy Kirin有了新更新的新闻,于是我开始了一个新系统=============================================个人评价:这个系统是一个国产操作系统。尽管使用了大量的Ubuntu和Windows设计,使用了Linux内核,但这是国产操作系统从无到有的开始,其意义和价值远远大于其使用价值。总之...

zabbix监控华为交换机

xmlversion=“1.0”encoding=“UTF-8”?...

easyExcel自动合并单元格

importcom.alibaba.excel.write.handler.CellWriteHandler;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.util.CellRangeAddress;int[]mergeColumnIndex){this.mergeRowInd...

为什么运行CMD后,一闪就不见了 解决方案

方法1:如果您中毒,系统中的一个进程正在监视您的命令。如果您看到CMD,可以关闭它。您可以检查任务管理中是否有流程。如果你关闭它,你应该可以打开它。如果没有,则说明已注入系统进程。很难杀死病毒。方法2:注册表:HKEY_LOCAL__清除MACHINE Software Microsoft CommandProcessor AutoRun中的值,即删除带有d...