2013-04-03 3 views
5
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 выполняется, как и ожидалось.ExceptionHandler весной

Однако, если я называю http://example.com/aa/bb/QQQ я бы ожидать, что функция handleTypeMismatchException называется, , но вместо этого, handleException называется, за исключением типа TypeMismatchException.

неприятный обходной путь, чтобы сделать это было бы, чтобы проверить тип исключения внутри handleException(), и вызвать handleTypeMismatchException если исключение типа TypeMismatchException.

но почему он теперь работает? Исключительный манипулятор выбирается во время выполнения в соответствии с типом исключения? или он выбран во время компиляции?

+0

Какое исключение выбрано в случае 'http: // example.com/aa/bb/QQQ' –

+0

Вызывается функция handleException (исключение исключения Exception), исключение является экземпляром TypeMismatchException. –

ответ

3

Выписка из official spring documentation:

используется метод @ExceptionHandler аннотацию внутри контроллера указать, какой метод вызывается, когда исключение определенного типа брошено во время выполнения методов контроллера

Исключение, которое вы пытаетесь поймать, генерируется самой пружиной (преобразование строки в двойное), перед выполнением фактического метода. Ловить его не в спецификации @ExceptionHandler. Это имеет смысл - как правило, вы не захотите ловить исключения, сгенерированные самой картой.

Смежные вопросы