6
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が、代わりに、 type を除いて handleException が呼び出されTypeMismatchExceptionます。

それを行う厄介な回避策は、内部で例外のタイプをテストし、例外のタイプが である場合にhandleException()呼び出すことです。handleTypeMismatchExceptionTypeMismatchException

しかし、なぜ今それが機能するのですか?例外ハンドラは、例外の種類に応じて実行時に選択されますか? それともコンパイル時に選択されますか?

4

1 に答える 1