public <T> T findOne(URI uri, Class<T> targetClass) {
   Assert.state(uri != null, "uri must be set to use this method");
   try {
     return restOperations.getForObject(uri, targetClass);
     // TODO check this exception translation and centralize.
   } catch (HttpClientErrorException clientError) {
     if (clientError.getStatusCode() == HttpStatus.NOT_FOUND) {
       throw new DocumentRetrievalFailureException(uri.getPath());
     }
     throw new CouchUsageException(clientError);
   } catch (HttpServerErrorException serverError) {
     throw new CouchServerResourceUsageException(serverError);
   } catch (RestClientException otherError) {
     throw new UncategorizedCouchDataAccessException(otherError);
   }
 }
  @Test
  public void testErrorResponseExceptionStrategy() {
    HttpMessageSender messageSender = new HttpMessageSender();
    String requestUrl = "http://localhost:8088/test";

    messageSender.setReplyMessageHandler(replyMessageHandler);

    messageSender.setRequestMethod(HttpMethod.POST);
    messageSender.setRequestUrl(requestUrl);

    messageSender.setErrorHandlingStrategy(ErrorHandlingStrategy.THROWS_EXCEPTION);

    Message<?> requestMessage =
        MessageBuilder.withPayload("<TestRequest><Message>Hello World!</Message></TestRequest>")
            .build();

    messageSender.setRestTemplate(restTemplate);

    reset(restTemplate, replyMessageHandler);

    restTemplate.setErrorHandler(anyObject(ResponseErrorHandler.class));
    expectLastCall().once();

    expect(
            restTemplate.exchange(
                eq(requestUrl), eq(HttpMethod.POST), anyObject(HttpEntity.class), eq(String.class)))
        .andThrow(new HttpClientErrorException(HttpStatus.FORBIDDEN))
        .once();

    replay(restTemplate, replyMessageHandler);

    try {
      messageSender.send(requestMessage);

      Assert.fail("Missing exception due to http error status code");
    } catch (HttpClientErrorException e) {
      Assert.assertEquals(e.getMessage(), "403 FORBIDDEN");

      verify(restTemplate, replyMessageHandler);
    }
  }