Issue
I have JUnit test of a method which send a JAX-RS POST
call.
To be independent from external resources I have mocked the REST client and said that a dummy response should be returned. Works great, no problem. But:
When calling myResponse.readEntity(String.class)
I always get the following Exception:
java.lang.IllegalStateException: RESTEASY003290: Entity is not backed by an input stream
Here is my code snippet which fails:
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import org.junit.Test;
public class SimpleTest {
@Test
public void testReadResponse() {
final JsonObject responseContent = new JsonObject();
responseContent.add("field", new JsonPrimitive("This is a JSON for testing."));
final String expected = responseContent.toString();
final Response.ResponseBuilder builder = Response.ok()
.entity(responseContent.toString())
.header("Content-Type", MediaType.APPLICATION_JSON);
final Response dummyResponse = builder.build();
final String result = dummyResponse.readEntity(String.class); // <-- Exception is thrown here!
assertThat("JSON Strings are not identical.", result, is(expected));
}
}
and the Stacktrace:
java.lang.IllegalStateException: RESTEASY003290: Entity is not backed by an input stream
at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:230)
at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:219)
at de.me.myproject.SimpleTest.testReadResponse(SimpleTest.java:43)
In my production code, which calls a not mocked REST API, it returns a automatically build response, where the .readEntity(String.class)
method works fine.
Solution
Response
is an abstract class and RESTEasy has different sub classes for client and server, see BuiltResponse
and ClientResponse
. Not all methods are supported in each sub class.
Response#readEntity
needs to be backed by an input stream:
Method throws an
ProcessingException
if the content of the message cannot be mapped to an entity of the requested type andIllegalStateException
in case the entity is not backed by an input stream or if the original entity input stream has already been consumed withoutbuffering
the entity data prior consuming.
A BuiltResponse
is never backed by an input stream and therefore you get a IllegalStateException
.
You can use Response#getEntity
, it doesn't need an input stream.
Answered By - dur
Answer Checked By - Marilyn (JavaFixing Volunteer)