当前位置: 首页 > 知识库问答 >
问题:

RESTEasy客户端异常处理

葛高澹
2023-03-14

我有一个使用RESTEasy的简单客户端,如下所示:

public class Test {
    public static void main(String[] args) {
        ResteasyClient client = new ResteasyClientBuilder().build();
        ResteasyWebTarget target = client.target("http://localhost");
        client.register(new MyMapper());
        MyProxy proxy = target.proxy(MyProxy.class);
        String r = proxy.getTest();
    }
}

public interface MyProxy {
   @GET
   @Path("test")
   String getTest();
}

@Provider
public class MyMapper implements ClientExceptionMapper<BadRequestException>{

    @Override
    public RuntimeException toException(BadRequestException arg0) {
        // TODO Auto-generated method stub
        System.out.println("mapped a bad request exception");
        return null;
    }

}

服务器配置为在http://localhost/test以及一条有用的信息。ClientProxy正在抛出一个BadRequestException。除了包装在try/catch中之外,我如何使getTest()捕获异常并以字符串形式返回响应的有用消息。我尝试了各种ClientExceptionMapper实现,但似乎都是正确的。上述代码从未调用toException。我错过了什么?

我目前的解决方法是使用ClientResponseFilter,然后执行setStatus(200)并将原始状态填充到响应实体中。这样我就避免了异常抛出。

共有2个答案

花阳辉
2023-03-14

我建议您使用Jax-RS客户端API,除非您需要使用RestEasy客户端的功能。(

Client client = ClientFactory.newClient();
WebTarget target = client.target("http://localhost/test");
Response response = target.request().get();
if ( response.getStatusCode() != Response.Status.OK.getStatusCode() ) {
    System.out.println( response.readEntity(String.class) );
    return null;
}
String value = response.readEntity(String.class);
response.close();

映射器不工作的原因是因为客户端实际上并没有抛出异常。客户端正在向代理返回一个有效的结果,代理正在读取该结果,并抛出异常,这发生在映射器可以拦截它之后。

牟华翰
2023-03-14

Resteasy中的ClientExceptionMapper已被弃用(参见java文档)

resteasy客户端模块中的JAX-RS 2.0客户端代理框架不使用org。jboss。放松点。客户例外制图员。ClientExceptionMapper。

尝试使用以下例外外观:

import javax.ws.rs.ClientErrorException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class MyMapper implements ExceptionMapper<ClientErrorException> {

    @Override
    public Response toResponse(ClientErrorException e) {
        return Response.fromResponse(e.getResponse()).entity(e.getMessage()).build();
    }
}

祝好

 类似资料:
  • 那么如何提取错误代码呢?我想提取错误代码并构建一个responseEntity 我得到了这段代码,但不知道如何在函数中使用。

  • 我正在尝试编写简单的RESTEasy客户端。下面给出了示例代码: 我在行中得到异常: 我在控制台中看到以下错误: 更新:我还尝试在POM中添加resteasy jax-rs依赖关系。我还通过在web.xml中添加以下行来验证是否启用了ResteasyProviderFactory: 请查看以下maven依赖项列表: 但这不起作用。 但现在我看到了其他方法的类似异常: 我在行中看到了这个例外: 奇怪

  • 我使用Apache Ignite 2.7.5作为.NET核心中服务器和瘦客户机。当我做与缓存相关的操作时,put、get和load等.net核心应用程序会自动崩溃。 因此,我想处理for循环内部的异常,例如、、等,然后从catch块抛出for循环,否则如果只有异常块,则继续循环迭代。

  • 我正在尝试处理下游服务抛出的异常并捕获错误代码以及错误响应消息。在网上搜索了一些解决方案后,我看到了下面处理异常的常用方法,但我真的不确定我必须在我的MyCustomConnectionException中写些什么?顺便说一下,当我使用Resttemplate时,我可以通过抛出HttpClientResponseException来轻松地处理并捕获所有内容,但我真的不知道这是如何工作的?我是使用W

  • 我对netty比较陌生,不确定自己做的事情是否正确。我会尽量短一点。如果有任何不清楚的地方,请询问更多信息。 因此,我有一个提供HTTP请求的netty服务器,其中的内容应该是序列化为Json字符串的protobuf消息。 通道管道如下所示: 前两个通道处理程序是标准的netty工具, HttpProtobufServerCodec类似于: 和HttpToProtobufDecoder类似于: 因

  • 我最近从Ruby的Net:HTTP类切换到rest-client 1.6.7。