RequestMapping转换异常

时间:2015-04-22 21:09:59

标签: spring spring-mvc

我有一个Spring RequestMapping,它采用JSON结构并将其转换为POJO。如果我发送路由格式错误的JSON结构,我会收到" 400 Bad Request"但我想收到的是一条错误消息,说明为什么这是一个糟糕的请求。我有一个Validator也检查JSON结构,但似乎如果结构无法转换它就不会被调用。有没有办法可以访问内置的HttpMessageConverter错误或异常?

2 个答案:

答案 0 :(得分:1)

我认为您可以通过覆盖handleHttpMessageNotReadable方法来使用ResponseEntityExceptionHandler

来自:17.11.3 Handling Standard Spring MVC Exceptions

  

如果您更喜欢通过@ExceptionHandler方法编写错误内容,则可以扩展ResponseEntityExceptionHandler。这是@ControllerAdvice类的一个方便的基础,它提供了一个@ExceptionHandler方法来处理标准的Spring MVC异常并返回ResponseEntity。这允许您使用消息转换器自定义响应并写入错误内容。有关更多详细信息,请参阅ResponseEntityExceptionHandler javadocs。

ResponseEntityExceptionHandler的示例用法可在此处找到:http://www.jayway.com/2013/02/03/improve-your-spring-rest-api-part-iii/

否则你可以在这里找到更多spring mvc异常处理方法: https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

如果您的需求不是太复杂,您可能只想使用SimpleMappingExceptionResolver

答案 1 :(得分:0)

ResponseEntityExceptionHandler 用于识别Spring 特定于MVC 的异常,并实施常见的错误响应处理策略为他们。

它包含许多方法,例如:

  1. handleMissingServletRequestParameter>如果请求无效,则进行处理 params
  2. handleHttpMessageNotReadable>处理无效请求 body
  3. handleExceptionInternal>一个单个位置,用于定制所有异常类型的响应正文。

下面提到的代码将覆盖 handleExceptionInternal 方法

@ControllerAdvice
public class JavaWebExeptionHandler extends ResponseEntityExceptionHandler {
    public class ExpnDetails {
        public int expnCode;
        public String expnMessage;
    }

    // A single place to customize the response body of all exception types.
    @Override
    protected ResponseEntity<ExpnDetails> handleExceptionInternal(Exception ex, Object body, 
                     HttpHeaders headers,HttpStatus status, WebRequest request) {
        return new ResponseEntity<Object>(new ExpnDetails(status.value(), ex.getMessage()), status);
    }
}

因此,所有Spring 特定于MVC 的异常都在一个地方处理,并且 ExpnDetails 对象作为响应 body 发送>由expnCode和expnMessage组成。

输出:

{
    "expnCode": 415,
    "expnMessage": "Content type 'application/json1' not supported"
}

{
    "expnCode": 400,
    "expnMessage": "JSON parse error: Unexpected character ('"
    ' (code 34)): was expecting comma to separate Object entries; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('
    "' (code 34)): was expecting comma to separate Object entries at [Source: (PushbackInputStream); line: 3, column: 4]"
}

注意:该解决方案还有助于隐藏容器(例如tomcat服务器)详细信息,以在请求失败时出现在响应错误中。

相关问题