2017-09-21 4 views
0

Ich versuche, WebApplicationException mit meiner javax.ws.rs.ext.ExceptionMapper Klasse zu fangen, aber ich bekomme ein seltsames Verhalten.Wie fangen WebApplicationException mit JAX-RS

Diese Methode meine einfache Rest ist:

@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.) Dies ist die Client-Klasse ist, die einen anderen Rest-API-Aufrufe:

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

Und Handler meine benutzerdefinierte Ausnahme, die die obige Ausnahme NICHT abfängt:

@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), aber wenn ich dies die Ausnahme tun gefangen (EchoRestClient.java):

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

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

Mein Code oben funktioniert gut und ich bekomme eine richtige Antwort, wenn ich die Methode saySomething Rest Anruf von meinem Webbrowser.

ABER, wenn ich die EchoService Ruhe entfestire (enthält die aufgerufene ping Rest-Methode) das HTTP 404 wird nicht im ersten Fall gefangen. Ich muss eine RuntimeException auslösen, weil WebApplicationException nicht abgefangen wird (2. Fall).

Gemäß der Dokumentation ist die Ausnahmehierarchie WebApplicationException extends RuntimeException.

Was ist hier falsch?

- EDIT -

Wenn ich werfe diese Ausnahme dann wird es gefangen fein: throw new WebApplicationException(response.getStatus())

Aber dies nicht funktioniert: throw new WebApplicationException(response)

Ist etwas nicht in Ordnung in dem Antwortobjekt ?

Antwort

0

Versuchen Sie,

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

Leider hat es nicht geholfen. – zappee