我正在测试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库。
答案 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时,您可能会在控制台/日志中遇到另一个异常。你应该开始检查,然后尝试解决这个问题。如果您在日志中找不到任何内容,是否可以发布更多代码?