解决Spring MVC @ExceptionHandler不起作用的问题

本文详细介绍了从ModelAndView的handleException方法到使用@ExceptionHandler注解进行异常处理的修复过程,包括方法名更改和错误日志记录。重点突出了在处理异常时,将返回值从ModelAndView更改为ModelAndView实例的必要性。

出错前:

ModelAndView handleException(Exception ex, Model model)

修复后:

	@ExceptionHandler(Exception.class)
	public ModelAndView handleException(Exception ex, WebRequest request) {
		ModelAndView mav = new ModelAndView(COMMON_ERROR_VIEWNAME);
		logger.error("服务器异常",ex);
		mav.addObject("ex", ex);
		return mav;
	}

 

原因是方法名不支持Model model

<think>我们被要求提供@ExceptionHandler作用于控制器方法的示例代码。根据引用[4],我们可以看到在TestController类中,有一个控制器方法test(),该方法会抛出异常(除以零)。同时,在同一个控制器类中,有一个用@ExceptionHandler注解的方法testErrorHandler,它负责处理该控制器中抛出的异常(这里是Exception类型)。 因此,我们可以编写一个类似的示例,展示@ExceptionHandler在控制器内部的使用。 示例代码: ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ExampleController { // 一个会抛出异常的方法 @GetMapping("/example") public String exampleMethod() { // 模拟异常:这里故意除以0来抛出ArithmeticException int result = 10 / 0; // 这将抛出ArithmeticException return "success"; } // 使用@ExceptionHandler注解处理本控制器中抛出的ArithmeticException @ExceptionHandler(ArithmeticException.class) public ModelAndView handleArithmeticException(ArithmeticException ex) { ModelAndView mav = new ModelAndView(); mav.setViewName("mathError"); // 设置视图名为mathError,对应一个错误页面 mav.addObject("errorMessage", "发生算术异常: " + ex.getMessage()); return mav; } } ``` 解释: 1. 我们在`ExampleController`控制器中定义了一个请求处理方法`exampleMethod`,它通过`@GetMapping("/example")`映射到URL路径`/example`。 2. 在`exampleMethod`方法中,我们故意进行了整数除以零的操作,这将抛出`ArithmeticException`。 3. 在同一个控制器中,我们定义了一个异常处理方法`handleArithmeticException`,它使用`@ExceptionHandler(ArithmeticException.class)`注解,指定处理`ArithmeticException`类型的异常。 4. 当`exampleMethod`方法抛出`ArithmeticException`时,Spring MVC调用`handleArithmeticException`方法来处理异常。该方法创建一个`ModelAndView`对象,设置视图名(通常对应一个错误页面),并将异常信息添加到模型中,以便在视图中显示。 注意:这种方式只对当前控制器(`ExampleController`)中的异常有效。如果想要全局处理异常,需要使用`@ControllerAdvice`注解,如引用[3]所示。 §§相关问题§§ 1. 如何全局处理Spring MVC中的异常? 2. @ControllerAdvice和@ExceptionHandler有什么区别和联系? 3. 在Spring MVC中,如何处理多个同类型的异常? </think>### @ExceptionHandler 作用于控制器方法的示例代码 以下是一个完整的 Spring MVC 控制器示例,展示了 `@ExceptionHandler` 在控制器内部处理异常的方式(基于引用[4]的实现): ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ProductController { // 控制器方法:模拟可能抛出异常的业务操作 @GetMapping("/product") public String getProductDetails() { // 模拟业务异常 if (productNotAvailable()) { throw new ProductNotFoundException("商品库存足"); } return "product-details"; } // 同一个控制器内的异常处理方法 @ExceptionHandler(ProductNotFoundException.class) public ModelAndView handleProductException(ProductNotFoundException ex) { ModelAndView mav = new ModelAndView("error/product-error"); mav.addObject("errorCode", "PRODUCT_404"); mav.addObject("errorMessage", ex.getMessage()); return mav; } // 处理控制器内所有未被特定处理的异常 @ExceptionHandler(Exception.class) public ModelAndView handleGenericException(Exception ex) { ModelAndView mav = new ModelAndView("error/generic-error"); mav.addObject("errorMessage", "请求处理失败: " + ex.getMessage()); return mav; } private boolean productNotAvailable() { // 模拟业务逻辑检查 return true; } } // 自定义异常类 class ProductNotFoundException extends RuntimeException { public ProductNotFoundException(String message) { super(message); } } ``` ### 关键说明: 1. **控制器内部异常处理** - `@ExceptionHandler` 方法定义在控制器类内部 - 只处理**当前控制器**抛出的指定异常类型(如 `ProductNotFoundException`) - 当 `getProductDetails()` 抛出异常时,自动路由到对应的异常处理方法 2. **异常处理流程** ```mermaid graph TD A[用户请求 /product] --> B{控制器方法执行} B -->|抛出 ProductNotFoundException| C[handleProductException] B -->|抛出其他异常| D[handleGenericException] C --> E[返回 product-error 视图] D --> F[返回 generic-error 视图] ``` 3. **方法参数说明** - 必需至少包含一个异常类型参数(`Exception` 或其子类) - 可添加 `HttpServletRequest`, `HttpServletResponse` 等参数 - 返回值通常是 `ModelAndView` 或 `String`(视图名) 4. **优先级规则** - 精确匹配的异常类型优先于通用异常处理 - 同一个控制器内 `@ExceptionHandler` 优先于全局 `@ControllerAdvice` 处理 注意:此方案适用于**控制器特定的异常处理**。如需跨控制器全局处理,应使用 `@ControllerAdvice`(如引用[3]所示)[^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值