Spring MVC处理异常

Spring MVC提供了一种定义明确的处理机制来管理应用程序抛出的异常。

主要思想:在控制器类中,使用@ExceptionHandler注解定义用于处理该异常的方法

语法:该注解可以接收异常类作为其value参数,比如@ExceptionHandler(UserNotFoundException.class)  其中UserNotFoundException是自定义的异常类,也可以指定处理多个异常类,比如这样@ExceptionHandler(value = {MissingServletRequestParameterException.class,BindException.class}),这样就会处理多个异常了。

用例:

Step1:定义一个扩展了Exception的自定义异常类UserNotFoundException

public class UserNotFoundException extends Exception {
    public UserNotFoundException(String name){
        super("User not found with name:"+name);
    }
}
Step2:控制器中定义使用注解@ ExceptionHandler的处理器方法

@Controller
public class UserExceptionController {
    private Map<String,UserException> users = new HashMap<String, UserException>();
    @PostConstruct
    public void setUsers(){
        users.put("mert",new UserException("Mert","Caliskan"));
        users.put("kenan",new UserException("Kenan","Sevindik"));
    }
    @RequestMapping("/formException")
    public ModelAndView user(){
        return new ModelAndView("userException","userException",new UserException());
    }
    @RequestMapping("/resultException")
    public ModelAndView process(String name)throws Exception{
        System.out.println(name);
        ModelAndView modelAndView = new ModelAndView();
        UserException userException = users.get(name);
        if ("johndoe".equals(name)){
            throw new Exception();
        }
        if(userException==null){
            System.out.println("In userException");
            throw new UserNotFoundException(name);
        }
        modelAndView.addObject("userException",userException);
        modelAndView.setViewName("userExceptionResult");

        return modelAndView;
    }

    @ExceptionHandler
    public ModelAndView handleException(UserNotFoundException e){
        ModelAndView modelAndView = new ModelAndView("errorUser");
        modelAndView.addObject("errorMessage",e.getMessage());

        return modelAndView;
    }
}

注意:这个只会是在当前的Controller里面起作用。一般来说应该在一个公共的中心位置处理异常,所以创建一个可以处理异常的全局方法就显得很有必要。Spring MVC提供了另一个注解@ControllerAdvice来完成该目的。使用注解@ControllerAdvice的类可以使用包含使用@ExceptionHandler、@InitBinder和@ModelAttribute注解的方法,而这些方法可以用于应用程序中使用@RequestMapping注解的所有方法。更通用的异常(比如SQLException或IOException)则可以在一个全局控制器中处理。

比如上述用户搜索关键字johndoe时,使用了java.lang.Exception类。全局控制器包含了处理该异常的方法

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(){
        return new ModelAndView("errorGlobal");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值