如何在Spring Boot Application中使用RestTemplate和异常处理程序获取消息或特定类型的Exception

时间:2019-02-27 14:15:34

标签: java spring rest spring-boot

我有 @RestController

@PostMapping
    public ResponseEntity doSmth(@RequestBody String json){
            ...
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            RestTemplate restTemplate = new RestTemplate();
            String url = "...";
            HttpEntity<String> requestEntity = new HttpEntity<>("body", headers);
            restTemplate.postForLocation(url, requestEntity);
            ....
    }
我正在呼叫的

应用程序 以下列方式工作:
1.返回 responseEntity
2.如果出现问题,它会 抛出异常

当它引发异常时,要感谢 异常处理程序 。它提供json作为有关问题信息的答案。

例如, SomeException 的异常处理程序:

@RestController
@ControllerAdvice
public class SomeExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(SomeException.class)
    public final ResponseEntity<ErrorDetails> handleUserNotFoundException(SomeException ex, WebRequest request) {
        final HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
        ErrorDetails errorDetails = new ErrorDetails(new Date(), status.value(), status.getReasonPhrase(), ex.getMessage(),
                request.getDescription(false));
        return new ResponseEntity<>(errorDetails, status);

ErrorDetails -仅POJO。需要为客户提供有关异常的信息。

当我使用restTemplate调用的应用程序引发异常时,
我收到 HttpServerError错误

System.out.println(error); //org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 null

问题
我需要知道哪个异常抛出在另一台服务器上或与哪个消息一起,但是对于任何消息中的任何异常,它都会给出这样的答案。

更新:
邮递员到服务器:
1. @PostMapping方法返回带有空主体和ResponseEntity标头的location(创建操作),因此客户端收到201状态码CREATED和位置。
2.如果出现问题,客户将收到json代表的ErrorDetails
服务器到服务器:
1. ResponseEntity responseEntity = restTemplate.postForObject(url,requestEntity, ResponseEntity.class);可行,但即使我尝试使用responseEntity.getHeaders()-它也不包含localtion
2.服务器向其处理程序抛出SomeException extends RuntimeException时-取决于状态码,我有一些异常(HttpServerError for 5xx)。

当我使用postForUrl时,我会收到location,但例外情况是相同的。

0 个答案:

没有答案