Как получить подробную информацию о ClientResponseFailure в RestEasy Client? - PullRequest
3 голосов
/ 23 июня 2010

Как получить HTTP-содержимое ответа, когда возвращается статус> = 400. Вот мой пример кода:

    try {
        ChatService client = ProxyFactory.create(ChatService.class, apiUrl);
        client.putMessage(dto);
    } catch (ClientResponseFailure ex) {
        System.out.println(ex.getResponse().getEntity().toString());
    }

Это броски:

Exception in thread "main" org.jboss.resteasy.spi.ReaderException: java.io.IOException: Stream closed
    at org.jboss.resteasy.core.messagebody.ReaderUtility.doRead(ReaderUtility.java:123)
    at org.jboss.resteasy.client.core.BaseClientResponse.readFrom(BaseClientResponse.java:246)
    at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:210)
    at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:171)
    at App.main(App.java:40)
Caused by: java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    at org.jboss.resteasy.client.core.SelfExpandingBufferredInputStream.read(SelfExpandingBufferredInputStream.java:58)
    at java.io.FilterInputStream.read(FilterInputStream.java:90)
    at org.jboss.resteasy.client.core.SelfExpandingBufferredInputStream.read(SelfExpandingBufferredInputStream.java:68)
    at org.jboss.resteasy.util.ReadFromStream.readFromStream(ReadFromStream.java:30)
    at org.jboss.resteasy.plugins.providers.ByteArrayProvider.readFrom(ByteArrayProvider.java:32)
    at org.jboss.resteasy.plugins.providers.ByteArrayProvider.readFrom(ByteArrayProvider.java:23)
    at org.jboss.resteasy.core.interception.MessageBodyReaderContextImpl.proceed(MessageBodyReaderContextImpl.java:105)
    at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.read(GZIPDecodingInterceptor.java:46)
    at org.jboss.resteasy.core.interception.MessageBodyReaderContextImpl.proceed(MessageBodyReaderContextImpl.java:108)
    at org.jboss.resteasy.core.messagebody.ReaderUtility.doRead(ReaderUtility.java:111)
    ... 4 more

Мне бы хотелось иметь больше подробностей, чем просто код состояния 400.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

При отладке я заметил, что необходимые данные были в объекте streamFactory как поток байтов XML.Я нашел этот раздел справки в документах RestEasy о ClientResponse .Там написано

getEntity(java.lang.Class<T2> type) 

, где getEntity может перенаправить вывод в нужный классВ моем случае у меня есть собственный класс для ошибок, возвращаемых из сервисов под названием ServiceError.Итак, это был класс, который я передал getEntity:

try {
    serviceResult = proxy.addCustomer(customerName, customerProfile);
} catch (ClientResponseFailure ex) {
    ClientResponse<String> cResp = ex.getResponse();
    ServiceError myEntity = cResp.getEntity(ServiceError.class);
    System.out.println("myEntity errorText=" + myEntity.getErrorMessage().getErrorText());
    System.out.println("myEntity errorCode=" + myEntity.getErrorMessage().getErrorCode());
}
0 голосов
/ 23 июня 2010

Это исключение, которое вы хотели отправить?

К сожалению, клиентская среда RestEASY не поддерживает маршалинг исключений как таковой, а вместо этого адаптирует его в среду HTTP. Исключения все равно должны быть выброшены на сервер, хотя. Я никогда не делал этого, вы можете использовать ExceptionMappers для проверенных исключений.

http://docs.jboss.org/resteasy/docs/1.2.GA/userguide/html/ExceptionHandling.html

...