zoukankan      html  css  js  c++  java
  • @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";
        }
    }

    展示结果:

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

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

  • 相关阅读:
    Vim+XDebug调试PHP
    JS实现多附件上传(asp.net) 中庸
    ajax+strutsi18n,validate framework(1)
    ExtJS+DWR+Spring+Hibernate开发HRMS(2)
    ajax+strutsi18n,validate framework(3)
    ajax+strutsi18n,validate framework(2)
    ajax+strutsi18n,validate framework(4)
    Java中参数传递的问题
    MyEclipse安装Extjs框架插件SpketIDE
    软件开发企业用人需求是怎样的?
  • 原文地址:https://www.cnblogs.com/javazl/p/12641083.html
Copyright © 2011-2022 走看看