如何在Spring REST异常处理程序中设置响应文本?

时间:2017-09-19 15:19:16

标签: java spring rest httpresponse

我正在使用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); }

1 个答案:

答案 0 :(得分:2)

我必须承认我被骗了。 Spring null打印的HttpClientErrorException值为statusText。此文字静态。例如,对于状态代码404,定义的状态文本是“未找到”。没有办法改变它。

为了接收实际的异常代码,Utku建议的方法是完全正确的。小问题是需要从HttpClientErrorException#getResponseBodyAsString()中提取错误消息,而不是像我尝试的那样从HttpClientErrorException#getStatusText()提取错误消息。