我有一个带有@ExceptionHandler的父类和一个带有它自己版本的子类.我得到一个模糊的方法错误

Nat*_*tor 7 java spring exception-handling exception spring-mvc

父母:

@ExceptionHandler(NoUserException.class)
protected ModelAndView handleException(NoUserException e) {
    Map<String, Object> model = new HashMap<String, Object>();

    model.put(ModelKeys.HOST_KEY, "message");

    return new ModelAndView("noAccess",model);
}
Run Code Online (Sandbox Code Playgroud)

孩子:

@ExceptionHandler(NoUserException.class)
protected void handleException(NoUserException e, HttpServletRequest request, HttpServletResponse response) throws IOException {
    logger.error("Invalid user.");
    respond(CLIENT_USER_ERROR,response);
}
Run Code Online (Sandbox Code Playgroud)

是的,我确实需要它们具有不同的参数和输出.

Aff*_*ffe 9

你不能有两个方法使用相同的异常处理程序,抱歉,它不受支持.解决它们的代码不能识别超级子类,并认为子类"更具体".org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver如果你感兴趣,代码就在.AbstractHandlerExceptionResolver基于那个直接在控制器上考虑方法的结果比继承的方法更具体的结果,制作自己的实现并不困难.

编辑:个人评论,我发现随着时间的推移,在制作Spring MVC注释驱动控制器时,最好压制使用"继承作为模板工具"的冲动.查看代码本身就具有笨重和程序性,这就是为什么我们首先创建一个单独的"视图层".干燥和"重复使用"的过度微观方法在这里没有用.如果它违反Liskov替代原则,我不会这样做.YMMV当然.