[英]JAX-RS (Reasteasy) Response.readEntity throws: IllegalStateException: RESTEASY003290: Entity is not backed by an input stream
我有一个发送JAX-RS POST
调用的方法的JUnit测试。 为了独立于外部资源,我模拟了REST客户端,并说应该返回一个虚拟响应。 效果很好,没问题。 但:
当调用myResponse.readEntity(String.class)
我总是得到以下异常:
java.lang.IllegalStateException:RESTEASY003290:实体不受输入流支持
这是我的代码片段失败:
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));
}
}
和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)
在我的生产代码中,它调用一个非模拟的REST API,它返回一个自动构建响应,其中.readEntity(String.class)
方法工作正常。
Response
是一个抽象类,RESTEasy有不同的客户端和服务器子类,请参阅BuiltResponse
和ClientResponse
。 并非每个子类都支持所有方法。
Response#readEntity
需要由输入流支持:
如果消息的内容无法映射到请求类型的实体,则抛出
ProcessingException
如果实体未被输入流支持,或者如果原始实体输入流已经被消耗而没有事先buffering
实体数据,则IllegalStateException
耗时。
BuiltResponse
永远不会被输入流支持,因此您会收到IllegalStateException
。
您可以使用Response#getEntity
,它不需要输入流。
谢谢你的提示。
我最终得到了以下对我有用的东西。 只需返回下面的类的新实例。
class MockResponse extends BuiltResponse {
private Object entity;
public MockResponse() {
}
public MockResponse(Object entity) {
this.entity = entity;
}
@Override
public <T> T readEntity(Class<T> type) {
return (T) entity;
}
@Override
public <T> T readEntity(Class<T> type, Type genericType, Annotation[] anns) {
return (T) entity;
}
}
今天我经历了同样的情况。 最后我有以下解决方案。 只需在BuiltResponse中模拟readEntity方法即可返回您需要的任何响应。 它对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.