En Jersey, ¿cómo podemos ‘reemplazar’ el estado de la cadena asociada con un código de estado?

por ejemplo,

return Response.status(401).build();

genera una respuesta HTTP que contiene:

HTTP/1.1 401 Unauthorized

I (a mí no, pero la aplicación cliente) quisiera ver la respuesta como:

HTTP/1.1 401 Authorization Required

He probado las siguientes enfoques, pero en vano:

1) sólo se agrega la Cadena en el cuerpo de la respuesta HTTP

return Response.status(401).entity("Authorization Required").build();

2) el Mismo resultado con esta demasiado:

ResponseBuilder rb = Response.status(401);
rb = rb.tag("Authorization Required");
return rb.build();

Agradezco su ayuda!

-spd

InformationsquelleAutor | 2010-01-07

2 Comentarios

  1. 38

    Para hacer esto en Jersey, usted tiene el concepto de WebApplicationException clase. Un método es simplemente extender esta clase y todo, uno de los métodos para establecer el texto de error que se devuelve. En tu caso sería:

    import javax.ws.rs.*;
    import javax.ws.rs.core.*;
    import javax.ws.rs.core.Response.*;
    
    
    public class UnauthorizedException extends WebApplicationException {
    
        /**
          * Create a HTTP 401 (Unauthorized) exception.
         */
         public UnauthorizedException() {
             super(Response.status(Status.UNAUTHORIZED).build());
         }
    
         /**
          * Create a HTTP 404 (Not Found) exception.
          * @param message the String that is the entity of the 404 response.
          */
         public UnauthorizedException(String message) {
             super(Response.status(Status.UNAUTHORIZED).entity(message).type("text/plain").build());
         }
    
    }

    Ahora en el código que implementa el resto de servicios que simplemente lanzar una nueva excepción de este tipo, pasando el valor de texto en el constructor por ejemplo,

    throw new UnauthorizedException("Authorization Required");

    Que puede crear una clase como esta para cada uno de su web excepciones y tirar en una manera similar.

    Esto se explica también en el Jersey guía de usuario – aunque el código es en realidad un poco incorrecta:

    https://jersey.github.io/nonav/documentation/latest/user-guide.html/#d4e435

    • No la OP preguntar por el camino a otros que entity(message)?
    • De acuerdo con @JinKwon, ¿cómo es esto diferente de 1) en el OP pregunta?
  2. 4

    No estoy seguro de JSR 339: JAX-RS 2.0: La API de Java para Servicios Web RESTful ya cubierto o no.

    Usted podría tener que ampliar la Respuesta.StatusType para esto.

    public abstract class AbstractStatusType implements StatusType {
    
        public AbstractStatusType(final Family family, final int statusCode,
                                  final String reasonPhrase) {
            super();
    
            this.family = family;
            this.statusCode = statusCode;
            this.reasonPhrase = reasonPhrase;
        }
    
        protected AbstractStatusType(final Status status,
                                     final String reasonPhrase) {
            this(status.getFamily(), status.getStatusCode(), reasonPhrase);
        }
    
        @Override
        public Family getFamily() { return family; }
    
        @Override
        public String getReasonPhrase() { return reasonPhrase; }
    
        @Override
        public int getStatusCode() { return statusCode; }
    
        public ResponseBuilder responseBuilder() { return Response.status(this); }
    
        public Response build() { return responseBuilder().build(); }
    
        public WebApplicationException except() {
            return new WebApplicationException(build());
        }
    
        private final Family family;
        private final int statusCode;
        private final String reasonPhrase;
    }

    Y aquí están algunos extendida statust tipos.

    public class BadRequest400 extends AbstractStatusType {
    
        public BadRequest400(final String reasonPhrase) {
            super(Status.BAD_REQUEST, reasonPhrase);
        }
    }
    
    public class NotFound404 extends AbstractStatusType {
    
        public NotFound404(final String reasonPhrase) {
            super(Status.NOT_FOUND, reasonPhrase);
        }
    }

    Esta es la forma en que lo hago.

    @POST
    public Response create(final MyEntity entity) {
    
        throw new BadRequest400("bad ass").except();
    }
    
    @GET
    public MyEntity read(@QueryParam("id") final long id) {
    
        throw new NotFound404("ass ignorant").except();
    }
    
    //Disclaimer
    //I'm not a native English speaker.
    //I don't know what 'bad ass' or 'ass ignorant' means.
    • Bien puesto, gracias por hacerme ver que el Estado tiene una interfaz que puedo lío con!
    • Este enfoque no parece funcionar con Jersey, ya que tiene una clase «com.sol.jersey.núcleo.spi.de la fábrica.ResponseImpl», que tiene su propia lógica para obtener el StatusType.

Dejar respuesta

Please enter your comment!
Please enter your name here