如何在 RestEasy 客户端中获取 ClientResponseFailure 的详细信息?

发布于 2024-09-06 09:58:37 字数 2269 浏览 8 评论 0原文

返回status >=400时如何获取http响应内容。这是我的代码示例:

    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。

How to get http response contents when status >=400 is returned. That's my code sample :

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

This throws :

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

I'd like to have more details than just status code 400.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

那小子欠揍 2024-09-13 09:58:38

这是您要发送的异常吗?

不幸的是,RestEASY 客户端框架本身不支持异常编组,而是将其改编到 HTTP 框架中。不过,仍然应该在服务器上抛出异常。我从来没有这样做过,你可以使用 ExceptionMappers 来检查异常。

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

Is that the exception you meant to send?

Unfortunately the RestEASY client framework doesn't support Exception marshalling per se, and instead adapts it into the HTTP framework. Exceptions should still be thrown on the server though. I've never done it, you can use ExceptionMappers for checked Exceptions.

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

小草泠泠 2024-09-13 09:58:38

调试时,我注意到我需要的详细信息位于“streamFactory”对象中,作为 XML 字节流。我在 RestEasy 文档中找到了关于 客户端响应。它表示

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());
}

When debugging I noticed that the details I needed were in the 'streamFactory' object as a byte stream of XML. I found this help topic in the RestEasy docs about ClientResponse. It says

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

where getEntity can marshal the output to the desired class. In my case, I have a custom class for errors returned from services called ServiceError. So, that was the class I passed to 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());
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文