首页 > 解决方案 > 如何处理 RestTemplate 中的响应代码而不捕获异常?[弹簧靴]

问题描述

我正在向另一个 Web 服务发送响应以创建用户。如果用户已经存在,它会发回 409 响应。我正在使用 RestTemplate 像这样:

    @PostMapping("/todos/{toDoNoteId}/users")
    public ResponseEntity <String> postUser(@RequestBody User user, @PathVariable int toDoNoteId, UriComponentsBuilder builder)throws HttpMessageNotReadableException, ParseException{

        RestTemplate restTemplate = new RestTemplate();
        final String uri = "http://friend:5000/users";

        try {
            ResponseEntity<String> result = restTemplate.postForEntity(uri, user, String.class); 
            return result;
        }
        catch (HttpClientErrorException ex) {
            return ResponseEntity.status(ex.getRawStatusCode()).headers(ex.getResponseHeaders())
                    .body(ex.getResponseBodyAsString());

        }
    }

虽然捕获异常有些工作(在 catch 块中我可以访问状态代码和正文),但有没有一种方法可以在没有异常的情况下访问它,类似于以下内容:

    @PostMapping("/todos/{toDoNoteId}/users")
    public ResponseEntity <String> postUser(@RequestBody User user, @PathVariable int toDoNoteId, UriComponentsBuilder builder)throws HttpMessageNotReadableException, ParseException{

        RestTemplate restTemplate = new RestTemplate();
        final String uri = "http://friend:5000/users";


            ResponseEntity<String> result = restTemplate.postForEntity(uri, user, String.class); 
            if(result.getStatusCode()=="409"){
            // do something
            }
            else{
            // do something else
            }
            return result;

   }

标签: springspring-bootresttemplate

解决方案


您可以创建自己的自定义 resttemplate 并定义异常处理程序。这是一个代码片段。

@Configuration
public class CustomRestTemplate extends RestTemplate {
    @Autowired
    private CustomErrorHandler customErrorHandler;

    @PostConstruct
    public void init() {
        this.setErrorHandler(customErrorHandler);
    }
}


@Component
public class CustomErrorHandler implements ResponseErrorHandler {
    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
      if(response.getStatusCode() != "409"){
       return true;
      }else {
       return false;
      }
    }

   @Override
    public void handleError(ClientHttpResponse response) throws IOException {
      String responseBody = response.getBody();//Pls read from InputStream and create write into String


            JSONObject jsonObj = new JSONObject(result);
            JSONArray jsonArray = new JSONArray();

            jsonObj.put("status", response.getStatusCode());
            jsonObj.put("body", responseBody );
            jsonArray.put(jsonObj);

            responseString = jsonArray.get(0).toString();


      throw new MyException(responseString );

   }

}

class MyException throw RuntimeException {
   public MyException (String message) {
        super(message);
    }

}

因此,您的课程将更改为

 @PostMapping("/todos/{toDoNoteId}/users")
    public ResponseEntity <String> postUser(@RequestBody User user, @PathVariable int toDoNoteId, UriComponentsBuilder builder)throws HttpMessageNotReadableException, ParseException{

        CustomRestTemplate restTemplate = new CustomRestTemplate ();
        final String uri = "http://friend:5000/users";

        ResponseEntity<String> result = restTemplate.postForEntity(uri, user, String.class); 
        return result       
    }

推荐阅读