泽西 response.readEntity(...) 有时 returns null

Jersey response.readEntity(...) sometimes returns null

考虑我的 REST 客户端 (Jersey 2.26) 中的这个片段。它用于 post 对象和 return 响应对象。如果 REST 服务器 return 出现错误(状态 >= 400),那么我不想 return 读取 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 的对象将按预期 return 编辑。但是,当确实发生错误时,response.readEntity(ErrorMessage.class) returns null。但是(这是奇怪的部分),这个 确实 给我数据(在 handleErrors 方法):

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

我可以使用它并手动反序列化它。但我首先想知道是否有任何选项可以在不实施解决方法的情况下解决这个问题。

从默认的 MOXy JSON(反)序列化器(我们现在使用 GSON 提供程序)切换后,问题已解决。

我们最近遇到了与 JSON-B 类似的问题。事实证明,我们必须在我们的错误对象上添加 getter 和 setter 才能(反)序列化对象。