【问题标题】:JAX RS Client: Catch exception message while making a REST callJAX RS 客户端:在进行 REST 调用时捕获异常消息
【发布时间】:2015-10-29 06:28:45
【问题描述】:

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

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 时,我能够收到错误消息。因此,我认为服务没有问题。

【问题讨论】:

    标签: java rest exception-handling jax-rs


    【解决方案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,它是一些设计理念的 cmets。

    【讨论】:

    • 非常感谢您的解决方案。我可以通过对传入响应执行 .readEntity 方法来访问错误消息。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2016-12-06
    • 2014-02-12
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多