2017-09-21 89 views
0

我试图用javax.ws.rs.ext.ExceptionMapper类捕获WebApplicationException,但我得到一个奇怪的行为。如何使用JAX-RS捕获WebApplicationException

这是我简单的REST方法:

@GET 
@Path("/saySomething") 
public List<String> saySomething() { 
    String response = EchoRestClient.ping(); 
    List<String> list = new ArrayList<>(); 
    list.add(response); 
    list.add("okay"); 
    return list; 
} 

(1)这是调用另一个REST API客户端类:

public class EchoRestClient { 
    private static Client client = ClientBuilder.newClient(); 

    public static String ping() { 
     String serviceUrl = PropertyReader.getProperty(ServiceUrl.ECHO_SERVICE); 

     Response response = client 
       .target(serviceUrl) 
       .path("saySomething") 
       .request(ExtendedMediaType.APPLICATION_UTF8) 
       .get(); 

     if (response.getStatus() == Response.Status.OK.getStatusCode()) { 
      return response.getEntity(String.class); 
     } 

     throw new WebApplicationException(response); 
    } 
} 

我的自定义异常处理程序,不能捕捉到上面抛出的异常:

@Provider 
public class WebservletExceptionMapper implements ExceptionMapper<Exception> { 
    @Override 
    public Response toResponse(Exception exception) { 

     System.out.println("caught exception"); 
     Response response; 

     if (exception instanceof WebApplicationException) { 
      response = ((WebApplicationException) exception).getResponse(); 
     } else { 
      response = Response....build(); 
     } 

     return response; 
    } 
} 

(第二),但如果我这样做了异常被捕获(EchoRestClient.java):

public static String ping() { 
    // same code then before 

    WebApplicationException e = new WebApplicationException(response); 
    throw new RuntimeException("xxxxxx", e); 
} 

上面我的代码工作正常,我也得到一个适当的反应,当我打电话从saySomething其他方法我网页浏览器。

但是,如果我取消部署EchoService其余部分(包含被调用的ping rest方法),HTTP 404不会在第一种情况下被捕获。我需要抛出一个RuntimeException,因为WebApplicationException没有被捕获(第二种情况)。

根据文档,异常层次结构是WebApplicationException,扩展了RuntimeException。

这里有什么问题?

- 编辑 -

如果我抛出此异常则细抓:throw new WebApplicationException(response.getStatus())

但是这一次不工作:throw new WebApplicationException(response)

有什么不对的响应对象?

回答

0

尝试做

@Provider 
public class WebservletExceptionMapper implements ExceptionMapper<WebApplicationException> { 
+0

遗憾的是它并没有帮助。 – zappee