'Unable to read application/json message in Response output

I'm testing REST API and while I make GET call to retrieve resources, it's resulting into 500 Internal Server Error and in output it's returning message which has media type application/json:

[
  {
    "messageType": "Some error type",
    "messageText": "Some message text",
    "moreInfo": "Some info"
  }
]

Please make note that in above output, Json is inside []

I want to read value of messageText from above output response. I tried with -

JsonObject jsonObject = response.readEntity(JsonObject.class);

but it results in following error:

java.lang.IllegalStateException: Entity input stream has already been closed.
    at org.glassfish.jersey.message.internal.EntityInputStream.ensureNotClosed(EntityInputStream.java:225)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:830)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:783)
    at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:326)
    at org.glassfish.jersey.client.InboundJaxrsResponse$1.call(InboundJaxrsResponse.java:111)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:399)
    at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:108)

Could you please help me how can I read the message in output? I'm using Jersy library.



Solution 1:[1]

According to javaDoc, a call to readEntity closes the response entity, so when you make another readEntity call you get IllegalStateException.

Unless the supplied entity type is an input stream, this method automatically closes the an unconsumed original response entity data stream if open.

In my case, having the expression response.readEntity(String.class) in the Expressions pane in the Debug perspective caused this exception when I ran the code in Debug mode. The evaluation of the expression consumed the entity and caused it to close.

Solution 2:[2]

I solved this by first doing the readEntity to a String entity and then using the Jackson ObjectMapper to actually deserialize to the target class.

Problematic code:

Transactions transObj = response.readEntity(Transactions.class);

Solution:

String stringEntity = response.readEntity(String.class);
Transactions transObj  = objectMapper.readValue(stringEntity, Transactions.class);

It seems this problem arises when the JSON string in the response entity stream is very long or complex possibly requiring multiple interactions thereon. 'Deserializing' to a string seems to only require a single bite. Once you have the string (and Jackson or GSON) de-serialization to target entity takes place without touching the response.

Solution 3:[3]

Actually it is a issue with how are we defining the reference of Response object . Solution is weird

Not Working one :

Response response;
if (condition) {
    response = 
} else {
    response = 
}
String resp = response.readEntity(String.class);
    if (response.getStatus() == 200) {}

Working One

Response response = null;
if (condition) {
    response = 
} else {
    response = 
}
String resp = response.readEntity(String.class);
if (response.getStatus() == 200) {}

So basically if we wont assign anything to response initially , Stream will be closed

Solution 4:[4]

When you get your error 500 you probably get another exception in the console/log. You should start checking that and then trying to resolve this one. If you don't find anything in the log, could you please post more code?

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 John Williams
Solution 3 dan1st
Solution 4 Aurasphere