繁体   English   中英

JAX-RS(Reasteasy)Response.readEntity抛出:IllegalStateException:RESTEASY003290:实体不受输入流支持

[英]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有不同的客户端和服务器子类,请参阅BuiltResponseClientResponse 并非每个子类都支持所有方法。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM