Java RESTEasy客户端异常处理
我有一个使用RESTEasy的简单客户端,如下所示:Java RESTEasy客户端异常处理,java,jax-rs,resteasy,Java,Jax Rs,Resteasy,我有一个使用RESTEasy的简单客户端,如下所示: public class Test { public static void main(String[] args) { ResteasyClient client = new ResteasyClientBuilder().build(); ResteasyWebTarget target = client.target("http://localhost"); client.regi
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;
}
}
公共类测试{
公共静态void main(字符串[]args){
ResteasyClient客户端=新的ResteasyClientBuilder().build();
ResteasyWebTarget=client.target(“http://localhost");
register(新的MyMapper());
MyProxy=target.proxy(MyProxy.class);
字符串r=proxy.getTest();
}
}
公共接口MyProxy{
@得到
@路径(“测试”)
字符串getTest();
}
@提供者
公共类MyMapper实现ClientExceptionMapper{
@凌驾
公共运行时异常到异常(BadRequestException arg0){
//TODO自动生成的方法存根
System.out.println(“映射了一个错误的请求异常”);
返回null;
}
}
服务器配置为在http://localhost/test
以及一条有用的消息。ClientProxy
正在抛出一个BadRequestException
。除了包装在try/catch
中之外,如何使getTest()
捕获异常并以字符串形式返回响应的有用消息。我尝试了各种ClientExceptionMapper
实现,但似乎都是正确的。上述代码从未调用toException
。我错过了什么
我目前的解决方法是使用
ClientResponseFilter
,然后执行setStatus(200)
并将原始状态填充到响应实体中。这样我就避免了异常抛出 我建议使用Jax-RS客户机API,除非您需要使用RestEasy客户机。(RestEasy附带Jax-RS,因此没有库差异)
映射程序无法工作的原因是客户端实际上没有抛出异常。客户端正在向代理返回一个有效结果,代理正在读取该结果并引发异常,该异常发生在映射程序可以拦截它之后。Resteasy中的ClientExceptionMapper已被弃用(请参阅) resteasy客户端模块中的JAX-RS 2.0客户端代理框架 不用 org.jboss.resteasy.client.exception.mapper.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();
}
}
import javax.ws.rs.ClientErrorException;
导入javax.ws.rs.core.Response;
导入javax.ws.rs.ext.ExceptionMapper;
导入javax.ws.rs.ext.Provider;
@提供者
公共类MyMapper实现ExceptionMapper{
@凌驾
公众对响应的响应(客户端){
返回Response.fromResponse(e.getResponse()).entity(e.getMessage()).build();
}
}
关于,您能解释一下“服务器配置为返回400错误请求”是什么意思吗?我的想法是
MyProxy.getTest()
的实现实际上应该抛出一个包含有用消息的异常。然后,您将使用ExceptionMapper将该异常映射到400错误的请求-响应(您可以将该消息作为响应的主体)。我写的是一个客户端,而不是服务器。但这不是丢掉了使用代理的所有好处吗(例如,上面的例子中/test是硬编码的)?我把这个问题理解为如何让代理抛出一个更有用的异常。我觉得奇怪的是,当实际消息在响应中时,代理返回一个带有硬编码消息“bad request”的异常。代理的异常处理是否有拦截器?代理没有保留有关底层错误的任何信息这一事实是一个非常致命的缺陷,IMHO。我能看到的唯一解决方法是让代理的方法返回响应,调用者可以从中获取实体和/或HTTP元素。但这意味着接口中不再指定实体返回类型。很遗憾,客户端异常处理。。。
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();
}
}