Java 我有一个带有@ExceptionHandler的父类和一个子类';他自己的版本。我得到一个不明确的方法错误
家长:Java 我有一个带有@ExceptionHandler的父类和一个子类';他自己的版本。我得到一个不明确的方法错误,java,spring,exception,spring-mvc,exception-handling,Java,Spring,Exception,Spring Mvc,Exception Handling,家长: @ExceptionHandler(NoUserException.class) protected ModelAndView handleException(NoUserException e) { Map<String, Object> model = new HashMap<String, Object>(); model.put(ModelKeys.HOST_KEY, "message"); return new ModelAn
@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);
}
是的,我确实需要它们具有不同的参数和输出。不能有两个方法具有相同的异常处理程序,抱歉,它就是不受支持。解决这些问题的代码在超级子类之间没有区别,并考虑子类“更具体”。代码是在<代码> org .prgFrrase.Web.servlet .MVC .注释中。不必很难在代码中直接考虑在控制器上的方法比继承方法更具体的结果。
编辑:个人评论,我发现随着时间的推移,在制作SpringMVC注释驱动的控制器时,我最好抑制使用“继承作为模板工具”的冲动。视图代码有时固有的笨重和程序性,这就是为什么我们首先要创建一个单独的“视图层”。在这里,过度的干燥和“重复使用”方法对你没有好处。如果它违反了Liskov替换原则,我不会这么做。当然是YMMV。为什么不将
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);
}
//超类
受保护的ModelAndView handleExceptionImpl(
无例外,
HttpServletResponse(响应){
映射模型=新的HashMap();
model.put(ModelKeys.HOST_KEY,“message”);
返回新模型和视图(“noAccess”,模型);
}
@ExceptionHandler(NoUserException.class)
受保护的模型和视图句柄异常(
无例外,
HttpServletResponse(响应){
返回handleExceptionImpl(e,response);
}
//子类
@凌驾
受保护的ModelAndView handleExceptionImpl(
无例外,
HttpServletResponse(响应){
logger.error(“无效用户”);
响应(客户端\用户\错误,响应);
}
你是什么意思?这是父类中的一些代码。。。这只是一个简单的抛出新的NoUserException()不是吗?当我运行它时,它正在发生。它无法决定使用哪个方法。可能是因为定义了两个@ExceptionHandler
,一个从超类继承,另一个在子类中定义。不知道如何重写它,它不会自动发生,因为这些方法没有相同的签名!这就是现实
// 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);
}