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!
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 xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>node1> sample>
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(); }