2010-01-07 5 views
21

В Джерси, как мы можем «заменить» строку состояния, связанную с известным кодом состояния?JAX/Jersey Пользовательский код ошибки в ответе

например.

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

генерирует ответ HTTP, который содержит:

HTTP/1.1 401 Unauthorized 

Я (не я, а клиентское приложение) хотел бы видеть реакцию как:

HTTP/1.1 401 Authorization Required 

Я попытался следующие но напрасно:

1) Это просто добавляет строку в тело ответа HTTP

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

2) Тот же результат с этим тоже:

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

Благодарим Вас за помощь!

-spd

ответ

36

Для этого в Джерси у вас есть понятие класса WebApplicationException. Один из методов заключается в том, чтобы просто расширить этот класс и весь один из методов, чтобы установить возвращаемый текст ошибки. В вашем случае это будет:

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

} 

Теперь в вашем коде, который реализует службу отдыха вы бы просто выбросить новое исключение из этого типа, передавая текстовое значение в конструкторе, например,

throw new UnauthorizedException("Authorization Required"); 

Это может создать такой класс для каждого из ваших веб-исключений и подобным образом.

Это также объясняется в руководстве пользователя Jersey - хотя код на самом деле немного неправильно:

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

+1

Разве ОП не задавал путь, отличный от 'entity (message)'? –

+1

Согласитесь с @JinKwon, как это отличается от 1) в вопросе OP? – TWiStErRob

4

Я не уверен, JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services уже охвачены или нет.

Возможно, вам понадобится удлинить 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; 
} 

И вот некоторые расширенные типы статистов.

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

Так я и поступаю.

@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

Хорошо, спасибо, что заставляете меня видеть, что у Status есть интерфейс, с которым я могу возиться! – TWiStErRob

+0

Этот подход, похоже, не работает с Джерси, поскольку у него есть класс «com.sun.jersey.core.spi.factory.ResponseImpl», у которого есть своя логика, чтобы получить StatusType. –

 Смежные вопросы

  • Нет связанных вопросов^_^