Jersey response.readEntity(...)有时会返回null

时间:2018-01-11 09:17:36

标签: jackson jersey jax-rs json-deserialization

考虑我的REST客户端(Jersey 2.26)中的这个片段。它用于发布对象并返回响应对象。如果REST服务器返回错误(status> = 400),那么我想要读取类型为T的实体并抛出包含错误消息对象的异常,而不是返回类型ErrorMessage的实体。

protected <T> T post(final Class<T> type,
                     final Object entity,
                     final Map<String, Object> queryParams,
                     final String methodPath,
                     final Object... arguments) {
  return postResponse(
    getInvocationBuilderJson(methodPath,
                             queryParams,
                             arguments),
    entity
  ).readEntity(type);
}

protected Response postResponse(final Invocation.Builder invocationBuilder,
                                final Object entity) {
  return handleErrors(
    invocationBuilder.post(Entity.entity(entity,
                                         MediaType.APPLICATION_JSON_TYPE))
  );
}

protected Response handleErrors(final Response response) {
  if (response.getStatus() >= 400) {
    throw new InvocationException(response.readEntity(ErrorMessage.class));
  }
  return response;
}

如果没有发生错误(状态<400),则按预期返回类型为T的对象。但是,当发生错误时,response.readEntity(ErrorMessage.class)会返回null。但是(这是奇怪的部分),这确实为我提供数据(handleErrors方法):

byte[] data = readAllBytes((InputStream) response.getEntity());

我可以使用它并手动反序列化..但我首先想知道是否有任何选项可以解决这个问题,而无需实现变通方法。

1 个答案:

答案 0 :(得分:0)

我不知道为什么,但是从默认的MOXy JSON(反)序列化器(我们现在正在使用GSON提供程序)切换后,问题得以解决。