我有一个Spring RequestMapping,它采用JSON结构并将其转换为POJO。如果我发送路由格式错误的JSON结构,我会收到" 400 Bad Request"但我想收到的是一条错误消息,说明为什么这是一个糟糕的请求。我有一个Validator也检查JSON结构,但似乎如果结构无法转换它就不会被调用。有没有办法可以访问内置的HttpMessageConverter错误或异常?
答案 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 的异常,并实施常见的错误响应处理策略为他们。
它包含许多方法,例如:
下面提到的代码将覆盖 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服务器)详细信息,以在请求失败时出现在响应错误中。