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

JAX RS Client: Catch exception message while making a REST call

我正在使用 ResteasyClient 为我的另一个服务 A 创建一个 REST 客户端。比如说,服务 A 抛出异常 CustomException 并显示一条消息:Got Invalid请求。 以下是我使用客户端的方式:

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 Bad Request。 您能否建议我如何访问错误消息?

注意: 当我使用 restClient 调用 serviceA 时,我能够收到错误消息。因此,我认为服务没有问题。

不要将响应直接反序列化为 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.

另请参阅 及其对一些设计想法的评论。