@ControllerAdvice

Posted javazl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@ControllerAdvice相关的知识,希望对你有一定的参考价值。

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

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

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

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

 

 技术图片

 

 显然这个界面是不友好的,那么我们可以用@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();

    }
}

访问页面结果:

技术图片

 

 

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

预设数据就是我们可以设置一个全局数据在任何的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的主要内容,如果未能解决你的问题,请参考以下文章

springboot + @ControllerAdvice + @ExceptionHandler 实现全局异常拦截,不用

SpringBoot学习13:springboot异常处理方式3(使用@ControllerAdvice+@ExceptionHandle注解)

ControllerAdvice 有条件地处理异常

在 SpringBoot 应用程序的 ControllerAdvice 中访问 HttpSession

Spring的@ExceptionHandler和@ControllerAdvice统一处理异常

如何在同一个 SpringMvc 应用程序中有两个 ControllerAdvice