8

家长:

@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);
}

孩子:

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

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

4

2 回答 2

12

您不能有两个方法具有相同的异常处理程序,对不起,它只是不受支持。解决它们的代码不区分超子类并认为子类“更具体”。org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver如果您有兴趣,代码在。不难使您自己的实现AbstractHandlerExceptionResolver基于将直接在控制器上的方法视为比继承方法更具体的结果的实现。

编辑:个人评论,随着时间的推移,我发现在制作 Spring MVC 注释驱动的控制器时,最好抑制使用“继承作为模板工具”的冲动。视图代码有时本质上是笨重的和程序化的,这就是为什么我们首先制作一个单独的“视图层”。DRY 和“重复使用”的过于微观的方法在这里对您没有用处。如果它违反了 Liskov 替换原则,我不会这样做。当然是 YMMV。

于 2012-07-18T16:58:42.507 回答
3

为什么不把实现委托handleException()给另一个方法呢?

// superclass
protected ModelAndView handleExceptionImpl(
        NoUserException e,
        HttpServletResponse response) {
    Map<String, Object> model = new HashMap<String, Object>();
    model.put(ModelKeys.HOST_KEY, "message");
    return new ModelAndView("noAccess",model);
}

@ExceptionHandler(NoUserException.class)
protected ModelAndView handleException(
        NoUserException e,
        HttpServletResponse response) {
    return handleExceptionImpl(e, response);
}

// subclass
@Override
protected ModelAndView handleExceptionImpl(
        NoUserException e,
        HttpServletResponse response) {
    logger.error("Invalid user.");
    respond(CLIENT_USER_ERROR,response);
}
于 2014-03-07T23:15:16.670 回答