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