2013-03-03 10 views
34

Sono nuovo in questo, cercando di ottenere la lettura di alcuni documenti ma non funziona, per favore abbiate pazienza.Maglia JAX-RS ExceptionMappers Eccezione definita dall'utente

ho creato un UserNotFoundMapper utilizzando ExceptionMappers come questo:

public class UserNotFoundMapper implements ExceptionMapper<UserNotFoundException> { 

@Override 
public Response toResponse(UserNotFoundException ex) { 
    return Response.status(404).entity(ex.getMessage()).type("text/plain").build(); 
} 

} 

Questo a mio servizio:

@GET 
@Path("/user") 
public Response getUser(@QueryParam("id") String id) throws UserNotFoundException{ 
    //Some user validation code with DB hit, if not found then 
    throw new UserNotFoundException(); 
} 

Il UserNotFoundException è un User-Defined eccezione.

ho provato questo:

public class UserNotFoundException extends Exception { 
     //SOME block of code 
} 

Ma quando invoco il servizio, il UserDefinedExceptionMapper non è sempre invocato. Sembra che manchi qualcosa nel UserDefinedException. Come definire questa eccezione allora?

Per favore fatemi sapere come definire il UserNotFoundException.

risposta

51

È necessario annotare il mapping delle eccezioni con @Provider, altrimenti non verrà mai registrato con il runtime JAX-RS.

@Provider 
public class UserNotFoundMapper implements 
     ExceptionMapper<UserNotFoundException> { 
    @Override 
    public Response toResponse(UserNotFoundException ex) { 
     return Response.status(404).entity(ex.getMessage()).type("text/plain") 
       .build(); 
    } 
} 
+0

Grazie per la risposta. Ho bisogno di sapere alcune cose relative a questo: dove si trova la differenza tra l'utilizzo di WebApplicationException e l'utilizzo di ExceptionMapper? Non sono sicuro di quali circostanze debbano essere usate :(Potete fornire i vostri input su questo? – WhoAmI

+3

@WhoAmI - le eccezioni delle applicazioni Web vengono automaticamente mappate dal provider JAX-RS. Quindi, al contrario di usare i mapping delle eccezioni, ad esempio , è possibile estendere 'WebApplicationException' e sovrascrivere il metodo' getResponse'.Alcune persone preferiscono farlo per tutte le eccezioni che definiscono esclusivamente per la loro implementazione JAX-RS. I mappatori sono tuttavia utili per la mappatura di eccezioni che non si estendono da WebApplicationException (ad esempio tutte le eccezioni Java standard, eccezioni da librerie di terze parti ecc. Ecc.). – Perception

+0

Questa affermazione: 'Le eccezioni delle applicazioni Web sono automaticamente mappate dal fornitore JAX-RS'. L'ho visto in molti documenti che sto leggendo in giro. Ma non è in grado di capire cosa significhi realmente in termini semplici e qual è l'importanza/utilità di esso :(Puoi spiegare per favore? – WhoAmI

0

Una piccola osservazione, tenta di utilizzare Response.Status.NOT_FOUND invece di usare 404 ecc codice sarà più leggibile e meno soggetto a errori di battitura, lo stesso vale per il "text/plain". Di seguito è riportato il codice che gestirà le eccezioni come hai menzionato. Oh, e un'altra cosa ricordarsi di annotare il metodo @Produces (MediaType.TEXT_PLAIN) nell'interfaccia

 

    public class UserNotFoundException extends Exception { 
     //... 
    } 

    public class UserServiceImpl implements UserService { 

     @Override 
     public Response getUser(@QueryParam("id") String id) { 
      final Response response; 
      try{ 
       // call user method 
       //if everything is ok 
       response = Response.status(Response.Status.OK).entity(whateverYouWant).type(MediaType.TEXT_PLAIN).build(); 
      } catch(UserNotFoundException ex) {   
       response = new UserNotFoundMapper().toResponse(ex); 
      } 

      return response; 
     } 
    } 

    In client slide you can check 

    public static boolean isUserExists(final Response serverResp) { 
     return serverResp != null && serverResp.getStatus() == Response.Status.NOT_FOUND.getStatusCode(); 
    } 

+6

Non si richiama manualmente il mapper e non si useranno classi specifiche di Jersey nel proprio livello di servizio. Questo è l'intero punto dei mappatori. –

+0

@RyanStewart Grazie per gli input. Sono nuovo di questo e sto cercando di impararlo. In teh sopra il codice postedd; se rimuovo la linea di invocazione del mapper con 'throw new UserNotFoundException();' allora va bene vero? Non capisco cosa intendessi per 'non utilizzeresti classi specifiche di Jersey nel tuo livello di servizio'. Puoi spiegarlo per favore in un po 'di dettagli? – WhoAmI

0

Cosa faccio di solito quando si creano le API è creare la mia eccezione che si estende da RuntimeException così ho don' Devo necessariamente catturare la mia eccezione.

Ecco un esempio:

NOTA: sto usando JAX-RS con Jersey

Prima: creare il mio Eccezione che si estende da RuntimeException.

public class ExceptionName extends RuntimeException { 

private int code; 
private String message; 

public int getCode(){ 
    return code; 
} 

public String getMessage(){ 
    return message; 
} 

public ExceptionName(int code, String message) { 
    this.code = code; 
    this.message = message; 
} 

} 

attuare anche un ExceptionMapper

@Provider 
public class ExceptionName implements ExceptionMapper<ExceptionName>{ 

    @Override 
    public Response toResponse(ExceptionName exception) { 
     return Response.status(exception.getCode()).entity(exception.getMessage()).build(); 
    } 

} 

E ogni volta che voglio un'eccezione faccio solo come questo ovunque, il mapper eccezione si prenderà cura di restituire una risposta al client che consumano l'API

Problemi correlati