Spring中的ExceptionHandler

时间:2013-04-03 09:56:57

标签: java spring spring-mvc

import org.springframework.beans.TypeMismatchException;
import javax.annotation.*;
import javax.servlet.http.*;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping(value = "/aa")
public class BaseController {

    @RequestMapping(value = "/bb/{number}", method = RequestMethod.GET, produces = "plain/text")
    public void test(@PathVariable final double number, final HttpServletResponse response) throws IOException {
        throw new MyException("whatever");
    }

    @ResponseBody
    @ExceptionHandler(MyException.class)
    public MyError handleMyException(final MyException exception, final HttpServletResponse response) throws IOException {
        ...
    }

    @ResponseBody
    @ExceptionHandler(TypeMismatchException.class)
    public MyError handleTypeMismatchException(final TypeMismatchException exception, final HttpServletResponse response) throws IOException {
        ...
    }

    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    @ExceptionHandler
    public MyError handleException(final Exception exception) throws IOException {
        ...
    }
}

如果我致电http://example.com/aa/bb/20 按预期执行函数handleMyException。

但是,如果我拨打http://example.com/aa/bb/QQQ 我希望函数handleTypeMismatchException被调用, 但是,调用handleException,类型TypeMismatchException除外。

一个令人讨厌的解决方法,就是测试handleException()内的异常类型, 如果异常类型为handleTypeMismatchException,则调用TypeMismatchException

但为什么它现在有效呢? 根据异常的类型在运行时选择exceptionhandler? 还是在编译时选择它?

1 个答案:

答案 0 :(得分:3)

摘自official spring documentation

  

您在控制器中使用@ExceptionHandler方法注释   指定在特定类型的异常时调用哪个方法   在执行控制器方法

期间抛出

在实际执行方法之前,您尝试捕获的异常是由spring本身(字符串到双重转换)生成的。捕获它不符合@ExceptionHandler的规范。这确实有意义 - 通常你不想捕获框架本身产生的异常。