我正在使用Spring REST控制器,特别是在异常处理程序上。异常处理程序按预期工作,我的JUnit-Test(使用Spring HTTP客户端)显示客户端收到正确的HTTP状态代码(400)。 HTTP客户端会自动将其转换为HttpClientErrorException
。
但是,打印HttpClientErrorException
始终会为我生成以下结果:
HttpClientErrorException: 400 null
...... null
部分令我担心。 难道这不应该是服务器端异常的消息所在的地方吗?
我检查了HTTP客户端的源代码,以查看抛出客户端异常的位置。它看起来像这样:
throw new HttpClientErrorException(statusCode, response.getStatusText(), response.getHeaders(), getResponseBody(response), getCharset(response));
调试此调用显示response.getStatusText()
在我的情况下为null
。
我的问题是:如何在服务器端设计ResponseEntity
,以便HTTP客户端在response.getStatusText()
而不是{{}}中找到服务器端异常消息{1}}?
null
...我在客户端状态文本中获得@ExceptionHandler({ MyCustomException.class })
public ResponseEntity<String> handleException(final HttpServletRequest req, final MyCustomException e) {
HttpHeaders headers = new HttpHeaders();
headers.set("Content-type", "text/plain");
String body = e.toString();
return new ResponseEntity<>(body, headers, HttpStatus.BAD_REQUEST);
}
。
答案 0 :(得分:2)
我必须承认我被骗了。 Spring null
打印的HttpClientErrorException
值为statusText
。此文字静态。例如,对于状态代码404,定义的状态文本是“未找到”。没有办法改变它。
为了接收实际的异常代码,Utku建议的方法是完全正确的。小问题是需要从HttpClientErrorException#getResponseBodyAsString()
中提取错误消息,而不是像我尝试的那样从HttpClientErrorException#getStatusText()
提取错误消息。