【问题标题】:Handling of various exception cases in rest template callREST模板调用中各种异常情况的处理
【发布时间】:2021-06-11 21:01:33
【问题描述】:

我正在调用 rest 模板以从其他微服务获取数据,为此我正在使用交换方法。这是我在调用特定函数时所做的,下面是相同的示例代码。

    @Service   
 public void findUserById() 
 {
    String username = "chathuranga";
    String password = "123";
    Integer userId = 1;

    String url = "http://localhost:8080/users/" + userId;

    //setting up the HTTP Basic Authentication header value
    String authorizationHeader = "Basic " + DatatypeConverter.printBase64Binary((username + ":" + password).getBytes());

    HttpHeaders requestHeaders = new HttpHeaders();
    //set up HTTP Basic Authentication Header
    requestHeaders.add("Authorization", authorizationHeader);
    requestHeaders.add("Accept", MediaType.APPLICATION_JSON_VALUE);

    //request entity is created with request headers
    HttpEntity<AddUserRequest> requestEntity = new HttpEntity<>(requestHeaders);

    ResponseEntity<FindUserResponse> responseEntity = restTemplate.exchange(
            url,
            HttpMethod.GET,
            requestEntity,
            FindUserResponse.class
    );

//    if (responseEntity.getStatusCode() == HttpStatus.OK) {
  //      System.out.println("response received");
        System.out.println(responseEntity.getBody());
    //} else {
    //    System.out.println("error occurred");
     //   System.out.println(responseEntity.getStatusCode());
    //}
}

要处理各种异常代码,例如 500、404,我想制作 resttemplate builder 类,(不是注释代码)为此必须在不同的类中编码,我是 referring this (custom hadler part)

我没有使用 try catch,因为当生产环境中发生多个调用时,这不是一个好方法。 在使用也需要处理的交换功能时,我也遇到了资源访问异常。 现在我不知道应该如何调用此类自定义处理程序来处理像 500 这样的响应。 如果有人可以帮助我提供示例代码,这将非常有帮助,因为我无法测试我的代码,因为到目前为止它还没有被部署用于测试目的

【问题讨论】:

  • 你能添加你的自定义错误处理程序吗?
  • @KrzysztofK 我没有那个我正在寻求方向和帮助,如果你能提供动力或有帮助的样本

标签: java spring-boot gradle exception resttemplate


【解决方案1】:

这是一个示例

@ControllerAdvice
public class ErrorHandler {

    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(ResourceAccessException.class)
    public @ResponseBody
    String handleResourceAccessException(
            ResourceAccessException ex) {
        return "internal server error";
    }
}

当你使用 @ControllerAdvice 时,它​​会捕获你在 @ExceptionHandler 中提到的异常,在这里你可以按照你想要的方式处理它。

如果你不想马上将响应返回给客户端,(例如忽略ResourceAccessException并继续),你可以重写DefaultResponseErrorHandler的handleError方法,该方法是RestTemplate用来处理非2xx代码的。

public class ErrorHandler extends DefaultResponseErrorHandler {

@Override
  public void handleError(ClientHttpResponse response, HttpStatus statusCode) {
      // write your code here
}
}

【讨论】:

  • 感谢您的及时回复,当我编写使用交换函数的代码时,我感到困惑,那么上述函数应该被调用的条件应该是什么
  • 1. @ControllerAdvice 将在 spring 2 自动扫描。如果你想添加 ErrorHandler。您可以在调用交换方法 restTemplate.setErrorHandler(new ErrorHandler()); 之前将错误处理程序设置为其余模板。 restTemplate.exchange( //这里写代码);
猜你喜欢
  • 1970-01-01
  • 2013-03-21
  • 2012-06-19
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
相关资源
最近更新 更多