Spring3 @ExceptionHandler 用于 ServletRequestBindingException

标签 spring spring-mvc

我正在使用默认 AnnotationMethodHandlerAdapter,我认为它应该启用对@ExceptionHandler 的支持。不幸的是,如果调用如下所示的处理程序方法,则会抛出 ServletRequestBindingException - 而不是调用 Exception 处理程序。

@RequestMapping(value = "/v1/products/{code}", method = RequestMethod.GET, headers = "Accept=application/xml,application/json")
@ResponseBody
public ProductDemoDTO getProductByCode(@PathVariable final String code,
        @RequestParam(required = false, defaultValue = "BASIC") final String options)
{
    //omitted
}

这里是 ExceptionHandler,从未调用过:
@ExceptionHandler(Throwable.class)
@ResponseBody
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
//TODO not being called?
public void handleException(final Exception e, final HttpServletRequest request, final Writer writer) throws IOException
{
    writer.write(String.format("{\"error\":{\"java.class\":\"%s\", \"message\":\"%s\"}}", e.getClass(), e.getMessage()));
}

有谁知道为什么不调用 ExceptionHandler ?

最佳答案

此问题已在 Spring 3.2 中修复。您可以使用 @ControllerAdvice 创建一个全局异常处理程序类。注解。然后在该类中添加一个 @ExceptionHandler处理 ServletRequestBindingException 并返回自定义响应正文的方法。例子:

@ControllerAdvice
public class GlobalExceptionHandler {
  @ExceptionHandler(ServletRequestBindingException.class)
  public ResponseEntity<String> handleServletRequestBindingException(ServletRequestBindingException ex)   {
      return new ResponseEntity<String>("MISSING REQUIRED HEADER",HttpStatus.PRECONDITION_REQUIRED);
  }
}

有关更多信息,请查看 spring mvc 文档:17.11 Handling exceptions

关于Spring3 @ExceptionHandler 用于 ServletRequestBindingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5153132/

相关文章:

java - Spring boot,可能导致View无法解决的问题

java - 如何在三元运算符中进行转换?

java - 在特定方法中禁用 spring 安全认证

Spring 框架: Search Properties by Name

java - 从 Asciidoctor 创建 PDF 文件时出现异常

java - 同时包含 HTML 和 JSP ViewResolvers

java - wildfly 9.0.0 读写方法之间的类型不匹配

java - 请求正文中的父类(super class) - 'application/xml;charset=UTF-8' 不受支持

java - Spring-Maven : Unable to load Javascript file

java - 从@ExceptionHandler 抛出异常以被另一个处理程序捕获