考虑我的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());
我可以使用它并手动反序列化..但我首先想知道是否有任何选项可以解决这个问题,而无需实现变通方法。
答案 0 :(得分:0)
我不知道为什么,但是从默认的MOXy JSON(反)序列化器(我们现在正在使用GSON提供程序)切换后,问题得以解决。