@ControllerAdvice用法

本文介绍Spring框架中的@ControllerAdvice注解,该注解用于控制器的全局配置集中管理。文章详细解释了如何使用@ControllerAdvice配合@ExceptionHandler、@InitBinder和@ModelAttribute进行全局异常处理、数据绑定及模型属性初始化。

源码

@ControllerAdvice,是Spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强。让我们先看看@ControllerAdvice的实现:

package org.springframework.web.bind.annotation;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {

@AliasFor("basePackages")
String[] value() default {};

@AliasFor("value")
String[] basePackages() default {};

Class<?>[] basePackageClasses() default {};

Class<?>[] assignableTypes() default {};

Class<? extends Annotation>[] annotations() default {};

该注解使用@Component注解,这样的话当我们使用< context:component-scan>扫描时就能扫描到。
如果你的spring-mvc配置文件使用如下方式扫描bean

<context:component-scan base-package="com.sishuok.es" use-default-filters="false">  
           <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  
</context:component-scan>  

还需要把@ControllerAdvice包含进来,否则不起作用:

<context:component-scan base-package="com.sishuok.es" use-default-filters="false">  
           <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  
           <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>  
</context:component-scan>  

用法

  • 通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置。
  • 注解了@ControllerAdvice的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
    • @ExceptionHandler:用于全局处理控制器里的异常。
    • @InitBinder:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。
    • @ModelAttribute:本来作用是绑定键值对到Model中,此处让全局的@RequestMapping都能获得在此处设置的键值对
  • @ControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上。

实例

package org.lhzhian.base.exception;    

import org.springframework.web.bind.annotation.ControllerAdvice;    
import org.springframework.web.bind.annotation.ExceptionHandler;     
import org.springframework.web.servlet.ModelAndView;    

/**  
 * 异常统一处理  
 * @author lhzhian 
 * @date 2016年4月28日  
 */    
@ControllerAdvice    
public class GlobalExceptionHandler {    

    private final static String ERROR_PAGE = "error";    

    @ExceptionHandler(Exception.class)    
    public ModelAndView handle(Exception e){     
        ModelAndView mv = new ModelAndView();    
        mv.addObject("message", e.getMessage());    
        mv.setViewName(ERROR_PAGE);    
        return mv;    
    }    

    @ModelAttribute
    //应用到所有@RequestMapping注解方法
    //此处将键值对添加到全局,注解了@RequestMapping的方法都可以获得此键值对
    public void addUser(Model model) { 
        model.addAttribute("msg", "此处将键值对添加到全局,注解了@RequestMapping的方法都可以获得此键值对");
    }  

    @InitBinder  
    //应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
    //用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。
    public void initBinder(WebDataBinder binder) {  
    } 

} 

error页面

    <%@ page language="java" contentType="text/html; charset=UTF-8" %>  
    <!DOCTYPE html">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    <title>Insert title here</title>  
    </head>  
    <body>  
        <h1>ERROR MESSAGE</h1>  
        <p>${message}</p>  
    </body>  
    </html>  
@ControllerAdvice是一个增强版的@Controller,它主要用于处理全局数据。一般情况下,我们会结合@ExceptionHandler、@ModelAttribute以及@InitBinder等注解一起使用。通过@ControllerAdvice,我们可以统一处理全局异常,预设全局数据以及对请求参数进行预处理。 @ControllerAdvice可以配置全局数据,通过使用@ModelAttribute注解来实现。我们可以在一个类中使用@ControllerAdvice注解,并在该类中定义一个带有@ModelAttribute注解的方法来配置全局数据。例如,我们可以创建一个GlobalConfig类,使用@ModelAttribute注解的方法来配置全局数据。 @ControllerAdvice用法可以分为以下几个步骤: 1. 处理全局异常:使用@ExceptionHandler注解来捕获并处理全局的异常。 2. 预设全局数据:使用@ModelAttribute注解来配置全局的数据,可以在一个类中定义多个带有@ModelAttribute注解的方法来配置不同的全局数据。 3. 请求参数预处理:使用@InitBinder注解来对请求参数进行预处理,例如进行类型转换或者数据验证等操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [@ControllerAdvice 用法](https://blog.youkuaiyun.com/ElendaLee/article/details/127431699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [@ControllerAdvice注解的使用](https://blog.youkuaiyun.com/czxboys/article/details/126137438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值