我正在使用ResteasyClient为我的另一个服务创建一个REST客户端A.比如,服务A抛出异常 CustomException 并显示一条消息:获得无效请求。 以下是我使用客户端的方式:
public Response callServiceA(final String query) {
ResteasyClient client = new ResteasyClientBuilder().build();
String link = "abc.com/serviceA";
ResteasyWebTarget target = client.target(link).path("call");
Form form = new Form();
form.param("query", query);
Response response;
try {
String data =
target.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(form,
MediaType.APPLICATION_FORM_URLENCODED_TYPE),
String.class);
response = Response.ok().entity(data).build();
} catch (Exception e) {
String message = e.getMessage();
e.printStackTrace();
response = Response.serverError().entity(e.getMessage()).build();
} finally{
client.close();
}
return response;
}
但是,当我打印堆栈跟踪时,我无法找到自定义错误消息。我只能将消息视为 HTTP 400错误请求。 您能否建议我如何访问错误消息?
注意:当我使用restClient调用serviceA时,我能够收到错误消息。因此,我不认为该服务存在问题。
答案 0 :(得分:1)
请勿直接将响应反序列化为String
。
String data = ...
.post(Entity.entity(form,
MediaType.APPLICATION_FORM_URLENCODED_TYPE),
String.class);
当你这样做(并且存在问题)时,你只会得到一个客户端异常,它不包含有关响应的信息。相反,只需使用重载的post
方法获取Response
Response response = ...
.post(Entity.entity(form,
MediaType.APPLICATION_FORM_URLENCODED_TYPE));
然后您可以从Response
获取详细信息,例如状态等。您可以使用response.readEntity(String.class)
获取正文。这样您就不需要处理任何异常。只需根据状态处理条件。
请注意,上面的Response
是入站Response
,与当前代码中的出站Response
不同。因此,请确保不要尝试发送入站Response
。
另见this answer及其对一些设计构思的评论。