JAX RS客户端:在进行REST调用时捕获异常消息

时间:2015-10-29 06:28:46

标签: java rest exception-handling jax-rs

我正在使用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时,我能够收到错误消息。因此,我不认为该服务存在问题。

1 个答案:

答案 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及其对一些设计构思的评论。