2010-06-23 5 views
3

Как получить содержимое ответа HTTP при возврате статуса> = 400. Вот мой пример кода:Как получить информацию о ClientResponseFailure в RestEasy Client?

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.

ответ

0

Это исключение вы имели в виду послать?

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

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

+0

На самом деле мне удалось создать ответ от исключения, расширив исключение WebApplicationException на стороне сервера. Моя проблема - прочитать тело ответа на стороне клиента. –

0

При отладке я заметил, что детали, которые я должен был в объекте «» 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()); 
} 

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

  • Нет связанных вопросов^_^