2010-06-23 9 views
3

Comment obtenir le contenu de la réponse http lorsque l'état> = 400 est renvoyé. C'est mon exemple de code:Comment obtenir les détails de ClientResponseFailure dans RestEasy Client?

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

Cela jette:

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 

Je voudrais avoir plus de détails qu'un simple code d'état 400.

Répondre

0

Est-ce que l'exception que vous vouliez dire envoyer?

Malheureusement, le framework client RestEASY ne prend pas en charge la gestion des exceptions en tant que telle, et l'adapte à la place dans le framework HTTP. Des exceptions devraient néanmoins être lancées sur le serveur. Je ne l'ai jamais fait, vous pouvez utiliser ExceptionMappers pour les exceptions vérifiées.

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

+0

En fait, j'ai réussi à créer une réponse à partir d'une exception en étendant WebApplicationException côté serveur. Mon problème est de lire le corps de la réponse du côté client. –

0

Lors du débogage je remarquai que les détails que je avais besoin étaient dans l'objet « StreamFactory » comme un flux d'octets de XML. J'ai trouvé ce sujet d'aide dans les documents RestEasy sur ClientResponse. Il est dit

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

où getEntity peut rassembler la sortie dans la classe désirée. Dans mon cas, j'ai une classe personnalisée pour les erreurs renvoyées par les services appelés ServiceError. Donc, c'était la classe que j'ai passé à 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()); 
} 
Questions connexes