Как обрабатывать коды ответов в RestTemplate без перехвата исключений? [Весенний ботинок] - PullRequest
0 голосов
/ 19 апреля 2019

Я отправляю ответ другому веб-сервису для создания пользователя. Если пользователь уже существует, он отправляет ответ 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());

        }
    }

Хотя перехват исключения несколько работает (в блоке перехвата я могу получить доступ к коду состояния и телу), есть ли способ получить к нему без исключения нечто похожее на это:

    @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;

   }

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Вы можете создать свой собственный шаблон рестайтинга и определить обработчик исключений.Вот фрагмент кода.

@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       
    }
0 голосов
/ 19 апреля 2019

Вы проверяли ExceptionHandler?Когда генерируется исключение, ExceptionHandler обрабатывает его.

Например:

@ControllerAdvice()
public class CustomExceptionHandler {
   private static final Logger logger = LogManager.getLogger("CustomExceptionHandler");

   @ExceptionHandler(YourException.class)
   public ResponseEntity handleYourException(HttpServletRequest request, YourException ex) {
       return ResponseEntity.ok("");
   }

   @ExceptionHandler(Exception.class)
   public ResponseEntity handleException(HttpServletRequest request, Exception ex) {
       logExp("Exception", request, ex);
       //return new ResponseEntity<>();
       return null;
   }
}
...