2010-01-07 22 views
21

W Jersey, w jaki sposób możemy "zastąpić" ciąg znaków związany ze znanym kodem statusu?JAX/Jersey Kod błędu niestandardowego w odpowiedzi

np.

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

generuje odpowiedź HTTP, który zawiera:

HTTP/1.1 401 Unauthorized 

ja (nie mnie, ale aplikacja kliencka) chciałbym zobaczyć odpowiedzi jako:

HTTP/1.1 401 Authorization Required 

Próbowałem następujących podejść, ale na próżno:

1) To po prostu dodaje ciąg w treści odpowiedzi HTTP

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

2) z tym samym rezultatem zbyt:

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

Dziękujemy za pomoc!

-spd

Odpowiedz

36

Aby to zrobić w Jersey masz pojęcie klasy WebApplicationException. Jedną z metod jest po prostu rozszerzenie tej klasy i wszystkich metod ustalania zwracanego tekstu błędu. W twoim przypadku będzie to:

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

} 

Teraz w kodzie, który implementuje usługę reszta będzie po prostu rzucić nowy wyjątek tego typu, przekazując wartości tekstowej w konstruktorze np

To może stworzyć taką klasę dla każdego wyjątku w sieci i zastosować podobny sposób.

to również wyjaśnione w przewodniku Jersey - mimo że kod jest faktycznie nieco niepoprawny:

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

+1

Czy OP nie pytał inaczej niż "entity (message)"? –

+1

Zgadzam się z @JinKwon, jak to jest inne niż 1) w pytaniu OP? – TWiStErRob

4

nie jestem pewien JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services już uwzględnione to, czy nie.

Być może będziesz musiał przedłużyć ten numer Response.StatusType.

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

A oto kilka rozszerzonych typów statustów.

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

Tak to robię.

@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. 
+1

Dobrze, dziękuję, że pokazałeś, że Status ma interfejs, z którym mogę zadzierać! – TWiStErRob

+0

To podejście nie działa z Jersey, ponieważ ma klasę "com.sun.jersey.core.spi.factory.ResponseImpl", która ma swoją własną logikę, aby uzyskać StatusType. –

Powiązane problemy