无法在响应输出中读取application / json消息

时间:2015-09-28 12:52:51

标签: java json jersey jersey-client

我正在测试REST API,当我进行GET调用以检索资源时,它导致500内部服务器错误,并且在输出中它返回了媒体类型为{{1}的消息}:

application/json

请注意,在上面的输出中,Json位于[ { "messageType": "Some error type", "messageText": "Some message text", "moreInfo": "Some info" } ]

我想从输出响应中读取[]的值。我试过 -

messageText

但会导致以下错误:

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

您能帮我解决一下如何在输出中阅读该消息?我正在使用Jersy库。

4 个答案:

答案 0 :(得分:13)

我正在为我的Jersey服务编写自动化测试,这些服务返回XML对象,偶尔也会遇到此错误。

根据javaDoc,对readEntity的调用会关闭响应实体,所以当你进行另一个readEntity调用时,你会得到IllegalStateException。

  

除非提供的实体类型是输入流,否则此方法   自动关闭未使用的原始响应实体数据   流如果打开。

在我的情况下,使用表达式response.readEntity(String.class) 当我在调试模式下运行代码时,在Debug透视图的Expressions窗格中导致此异常。对表达式的评估消耗了实体并使其关闭。

答案 1 :(得分:1)

我先对String实体执行readEntity,然后使用Jackson ObjectMapper实际反序列化到目标类,从而解决了这个问题。

问题代码:

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

解决方案:

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

当响应实体流中的JSON字符串很长或很复杂,可能需要在其上进行多次交互时,似乎会出现此问题。将“反序列化”为字符串似乎只需要一口即可。有了字符串(以及Jackson或GSON)后,就可以对目标实体进行反序列化,而无需触摸响应。

答案 2 :(得分:1)

实际上,如何定义Response对象的引用是一个问题。 解决方法很奇怪

不工作:

sudo sh work/Rotate.sh

工作一个

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

因此,基本上,如果我们最初不会为响应分配任何内容,则Stream将被关闭

答案 3 :(得分:0)

当您收到错误500时,您可能会在控制台/日志中遇到另一个异常。你应该开始检查,然后尝试解决这个问题。如果您在日志中找不到任何内容,是否可以发布更多代码?