2017-09-21 4 views
0

J'essaie d'attraper WebApplicationException avec ma classe javax.ws.rs.ext.ExceptionMapper mais j'ai un comportement étrange.Comment faire pour attraper WebApplicationException avec JAX-RS

Ceci est ma méthode simple de repos:

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

(1er) Ceci est la classe client qui appelle un autre repos 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); 
    } 
} 

Et mon habitude gestionnaire d'exception, qui n'attrape PAS l'exception levée ci-dessus:

@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; 
    } 
} 

(2), mais si je fais l'exception est pris (EchoRestClient.java):

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

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

Mon code ci-dessus fonctionne bien et je reçois une réponse appropriée quand je l'appelle la méthode de repos saySomething de mon navigateur Web.

MAIS si je ne déploier pas le reste EchoService (contient la méthode de repos ping appelée) le HTTP 404 n'est pas pris dans le 1er cas. J'ai besoin de lancer une exception RuntimeException car WebApplicationException n'est pas interceptée (2ème cas). Selon la documentation, la hiérarchie des exceptions est WebApplicationException extends RuntimeException.

Quel est le problème ici?

- EDIT -

Si je jette cette exception, alors il est pris fin: throw new WebApplicationException(response.getStatus())

Mais celui-ci ne fonctionne pas: throw new WebApplicationException(response)

quelque chose de mal dans l'objet de réponse ?

Répondre

0

Essayez de faire

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

Malheureusement, il n'a pas aidé. – zappee