我有@Controller
实现了一个接口,但是没有执行抽象@ExceptionHandler
上的BaseController
方法。
我已经调试了,似乎AnnotationMethodHandlerExceptionResolver
有这一行试图找到带注释的方法
ExceptionHandler exceptionHandler
= AnnotationUtils.findAnnotation(method, ExceptionHandler.class);
但它只传递了接口上的方法,我无法将方法添加到此接口。
Spring会这样做
final Class<?> handlerType = ClassUtils.getUserClass(handler);
然后在迭代可用方法时使用handlerType。
ClassUtils.getUserClass(handler)
-
返回给定实例的用户定义类:通常很简单 给定实例的类,但是在原始类的情况下 CGLIB生成的子类。
其中handle实际上是我的控制器implamentation类,但最后是代理。
使用Spring 3.2,使用context:component-scan注册控制器。所以我的问题,如果不是很明显,我如何让Spring调用异常处理程序方法?
interface ControllerInterface {
String doStuff();
}
@Controller
public class Controller extends BaseController implements ControllerInterface {
public String doStuff() {
throw new ServiceException();
}
}
public class BaseController {
@ExceptionHandler(ServiceException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public Error handleException(ServiceException exp) {
return new Error(exp.getCode(), exp.getMessage());
}
}