Exception personnalisée JAX-RS (Jersey) avec XML ou JSON

J’ai un service REST construit en utilisant Jersey.

Je souhaite pouvoir définir le MIME de mes enregistreurs d’exceptions personnalisés en fonction du MIME envoyé au serveur. application/json est renvoyé lorsque json est reçu et application/xml lorsque xml est reçu.

Maintenant, je code l’ application/json , mais les clients XML sont laissés dans l’ignorance.

 public class MyCustomException extends WebApplicationException { public MyCustomException(Status status, Ssortingng message, Ssortingng reason, int errorCode) { super(Response.status(status). entity(new ErrorResponseConverter(message, reason, errorCode)). type("application/json").build()); } } 

Quel contexte puis-je exploiter pour obtenir les requêtes en cours Content-Type ?

Merci!


Mise à jour basée sur la réponse

Pour toute personne intéressée par la solution complète:

 public class MyCustomException extends RuntimeException { private Ssortingng reason; private Status status; private int errorCode; public MyCustomException(Ssortingng message, Ssortingng reason, Status status, int errorCode) { super(message); this.reason = reason; this.status = status; this.errorCode = errorCode; } //Getters and setters } 

Avec un ExceptionMapper d’ ExceptionMapper

 @Provider public class MyCustomExceptionMapper implements ExceptionMapper { @Context private HttpHeaders headers; public Response toResponse(MyCustomException e) { return Response.status(e.getStatus()). entity(new ErrorResponseConverter(e.getMessage(), e.getReason(), e.getErrorCode())). type(headers.getMediaType()). build(); } } 

Où ErrorResponseConverter est un POJO JAXB personnalisé

Vous pouvez essayer d’append un champ / propriété @ javax.ws.rs.core.Context javax.ws.rs.core.HttpHeaders à votre classe de ressource racine, au paramètre de la méthode de ressource ou à un javax.ws.rs.ext.ExceptionMapper personnalisé. et appeler HttpHeaders.getMediaType ().

headers.getMediaType () répond avec le type de média de l’entité, pas l’en-tête Accept. La manière appropriée de convertir l’exception est d’utiliser l’en-tête Accept pour que votre client obtienne la réponse au format demandé. Compte tenu de la solution ci-dessus, si votre demande ressemble à celle-ci (notez l’en-tête JSON accept, mais l’entité XML), vous récupérerez XML.

 POST http: // localhost: 8080 / service / giftcard / invoice? Draft = true HTTP / 1.1
 Accepter: application / json
 Autorisation: Basic dXNlcjp1c2Vy
 Type de contenu: application / xml
 Agent utilisateur: Jakarta Commons-HttpClient / 3.1
 Hôte: localhost: 8080
 Connexion proxy: Keep-Alive
 Longueur du contenu: 502
     

L’implémentation correcte est à nouveau pour utiliser l’en-tête Accept:

 public Response toResponse(final CustomException e) { LOGGER.debug("Mapping CustomException with status + \"" + e.getStatus() + "\" and message: \"" + e.getMessage() + "\""); ResponseBuilder rb = Response.status(e.getStatus()).entity( new ErrorResponseConverter(e.getMessage(), e.getReason(), e.getErrorCode())); List accepts = headers.getAcceptableMediaTypes(); if (accepts!=null && accepts.size() > 0) { //just pick the first one MediaType m = accepts.get(0); LOGGER.debug("Setting response type to " + m); rb = rb.type(m); } else { //if not specified, use the entity type rb = rb.type(headers.getMediaType()); // set the response type to the entity type. } return rb.build(); }