restful example java http jersey response

java - example - Código de error personalizado de JAX/Jersey en Respuesta



response.ok java (2)

No estoy seguro de JSR 339: JAX-RS 2.0: la API de Java para los servicios web RESTful ya cubría esto o no.

Es posible que tenga que extender el Response.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í hay algunos tipos de estatuto extendido.

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

Así es como 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.

En Jersey, ¿cómo podemos ''reemplazar'' la cadena de estado asociada con un código de estado conocido?

p.ej

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

genera una respuesta HTTP que contiene:

HTTP/1.1 401 Unauthorized

Yo (no yo, sino la aplicación cliente) me gustaría ver la respuesta como:

HTTP/1.1 401 Authorization Required

Probé los siguientes enfoques pero en vano:

1) Esto solo agrega la Cadena en el cuerpo de la respuesta HTTP

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

2) El mismo resultado con esto también:

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

¡Aprecio tu ayuda!

-spd


Para hacer esto en Jersey tienes el concepto de clase WebApplicationException. Un método es simplemente extender esta clase y todos los métodos para establecer el texto de error que se devuelve. En tu caso esto 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 su código que implementa el servicio de descanso, simplemente lanzaría una nueva excepción de este tipo, pasando el valor de texto en el constructor, por ejemplo

throw new UnauthorizedException("Authorization Required");

Eso puede crear una clase como esta para cada una de sus excepciones web y lanzar de una manera similar.

Esto también se explica en la guía del usuario de Jersey, aunque el código es ligeramente incorrecto:

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