sgs*_*web 28 java spring exception-handling spring-mvc
使用Spring 3,我喜欢使用ExceptionHandler注释创建一个异常处理程序,该注释将处理"找不到页面(404)"请求.我使用以下代码来执行此操作.但是当我指向一个不存在的URL时,将调用Spring定义的默认异常处理程序.
可能是我正在处理NoSuchRequestHandlingMethodException异常.如果是,那么我应该注册什么例外?
请你看看下面的代码,看看我做错了什么?
注意:如果我将@ExceptionHandler中的异常更改为NullPointerException并创建一个RequestMapping来抛出空指针,那将会起作用.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class GeneralHandler {
private final Log logger = LogFactory.getLog(getClass());
@ExceptionHandler(NoSuchRequestHandlingMethodException.class)
public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) {
ModelAndView mav = new ModelAndView();
logger.error("Exception found: " + ex);
return mav;
}
}
Run Code Online (Sandbox Code Playgroud)
ska*_*man 41
@ExceptionHandler当@RequestMapping同一个类上的方法抛出异常时,将调用注释方法.因此,当您添加了抛出的NullPointerException映射时,由于映射的方法和异常处理程序在同一个类中一起工作.
如果没有找到映射,Spring就无法将NoSuchRequestHandlingMethodException你的关联与你的关联@ExceptionHandler,因为它没有达到将请求与处理程序方法匹配的程度.这在文档中没有明确提及,而是我观察到的行为.
如果你想特别处理这个例外,你将不得不使用更通用的HandlerExceptionResolver方法,而不是更专业的@ExceptionHandler技术.
Jan*_*ing 16
在Spring 3.2中,您可以使用@ContollerAdvice为所有控制器提供ExceptionHandler,如下所示:
@ControllerAdvice
public class GeneralHandler {
@ExceptionHandler
public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) {
ModelAndView mav = new ModelAndView();
...
return mav;
}
}
Run Code Online (Sandbox Code Playgroud)
您甚至可以添加更多注释来返回序列化的json
@ExceptionHandler
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public RestError resolveBindingException ( MethodArgumentNotValidException methodArgumentNotValidException, Locale locale )
{
BindingResult bindingResult = methodArgumentNotValidException.getBindingResult();
return getRestError(bindingResult, locale);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41133 次 |
| 最近记录: |