2015-06-03 2 views
7

У меня есть простой клиент, использующий Resteasy следующим образом:Resteasy Client Обработка исключений

public class Test { 
    public static void main(String[] args) { 
     ResteasyClient client = new ResteasyClientBuilder().build(); 
     ResteasyWebTarget target = client.target("http://localhost"); 
     client.register(new MyMapper()); 
     MyProxy proxy = target.proxy(MyProxy.class); 
     String r = proxy.getTest(); 
    } 
} 

public interface MyProxy { 
    @GET 
    @Path("test") 
    String getTest(); 
} 

@Provider 
public class MyMapper implements ClientExceptionMapper<BadRequestException>{ 

    @Override 
    public RuntimeException toException(BadRequestException arg0) { 
     // TODO Auto-generated method stub 
     System.out.println("mapped a bad request exception"); 
     return null; 
    } 

} 

Сервер настроен вернуть 400 - Bad Request на http://localhost/test вместе с полезным сообщением. A BadRequestException подбрасывается ClientProxy. Помимо обертывания в try/catch, как я могу сделать getTest(), поймать исключение и вернуть полезное сообщение Response в виде строки. Я пробовал различные версии ClientExceptionMapper, но просто может показаться, что все правильно. Вышеприведенный код никогда не вызывает toException. Что мне здесь не хватает?

Моей текущей практикой является использование ClientResponseFilter, а затем выполните setStatus(200) и введите исходный статус в объекте ответа. Таким образом я избегаю исключения.

+0

Можете ли вы объяснить, что вы подразумеваете под «Сервер настроен на возврат 400-плохого запроса»? Моя мысль заключается в том, что реализация 'MyProxy.getTest()' должна фактически вызывать исключение, содержащее полезное сообщение. Затем вы должны использовать ExceptionMapper для сопоставления этого исключения с ответом 400 - Bad Request (и вы могли бы включить это сообщение в качестве тела ответа). – FGreg

+1

Прочтите первое предложение по моему вопросу. Я пишу клиент, а не сервер. – gogators

ответ

-1

Я бы посоветовал использовать API-интерфейс Jax-RS, если только нет необходимости в использовании функций клиентов RestEasy. (Resteasy поставляется с JAX-RS, так что нет никаких различий библиотечных)

Client client = ClientFactory.newClient(); 
WebTarget target = client.target("http://localhost/test"); 
Response response = target.request().get(); 
if (response.getStatusCode() != Response.Status.OK.getStatusCode()) { 
    System.out.println(response.readEntity(String.class)); 
    return null; 
} 
String value = response.readEntity(String.class); 
response.close(); 

Причины, почему ваш картограф не работает потому, что клиент на самом деле не бросает исключение. Клиент возвращает действительный результат в прокси-сервер, а прокси-сервер читает это и генерирует исключение, которое происходит после того, как обработчик может его перехватить.

+0

Не исключает ли это все преимущества использования прокси-сервера (например,/test жестко закодирован в примере выше)? Я прочитал вопрос о том, как получить прокси, чтобы бросить более полезное исключение. Мне странно, что прокси возвращает исключение с жестко закодированным сообщением «плохой запрос», когда фактическое сообщение находится в ответе. Существует ли перехватчик для обработки исключений прокси-сервера? –

Смежные вопросы