2016-06-29 7 views
1

Ist es möglich, eine Nachricht in eine BadRequestException aufzunehmen, wenn der Benutzer einen Antwortcode 400 sieht, kann er/sie auch herausfinden warum?Wie Sie eine Nachricht in eine BadRequestException aufnehmen?

würde das Szenario so etwas wie dies, vereinfacht:

public Entity getEntityWithOptions(@PathParam("id") String id, @QueryParam("option") String optValue) { 
    if (optValue != null) { 
     // Option is an enum 
     try { 
      Option option = Option.valueOf(optValue); 
     } catch (IllegalArgumentException e) { 
      throw new BadRequestException(e.getMessage()); 
     } 
     return new Entity(option); 
    } 
    return new Entity(); 
} 

Ich weiß, das stattdessen ein Response Objekt durchgeführt werden kann zurückkehren, aber ich möchte das nicht.

Ist das möglich? Vielleicht mit einem ExceptionMapper<BadRequestException>? Oder dies ist nicht möglich, da BadRequestException bereits eine Jersey-spezifische Ausnahme ist?

+0

Ich denke, die Botschaft in den Konstruktor gesetzt werden kann, nicht wahr? Und wenn ein ExceptionMapper verwendet wird, gibt es tatsächlich eine Antwort zurück. – Cuero

+0

Ich übermittle die Nachricht an den Konstruktor, aber die Antwort enthält es nicht. – dabadaba

+0

Wenn ein exceptionMapper verwendet wird, wird die an den Konstruktor gesendete Nachricht angezeigt. Machen Sie den Mapper einfach so: public Antwort toResponse (BadRequestException e) {return Antwort.status (Response.Status.BAD_REQUEST) .type (MediaType.TEXT_PLAIN) .entity (ExceptionUtils.getStackTrace (e)). Build();} – Cuero

Antwort

0

Sie sollten eine benutzerdefinierte Ausnahme wie diese

public class CustomBadReq extends WebApplicationException { 
    public CustomBadReq(String message) { 
     super(Response.status(Response.Status.BAD_REQUEST) 
      .entity(message).type(MediaType.TEXT_PLAIN).build()); 
    } 
} 

See schaffen auch this

1

Sie einen CustomException werfen kann und es zu einem CustomExceptionMapper Karte maßgeschneiderte Antwort zu liefern.

public class CustomException extends RuntimeException {  
    public CustomException(Throwable throwable) { 
     super(throwable); 
    } 

    public CustomException(String string, Throwable throwable) { 
     super(string, throwable); 
    } 

    public CustomException(String string) { 
     super(string); 
    } 

    public CustomException() { 
     super(); 
    } 
} 

@Provider 
public class CustomExceptionMapper implements ExceptionMapper<CustomException> { 
    private static Logger logger = Logger.getLogger(CustomExceptionMapper.class.getName()); 
    /** 
    * This constructor is invoked when exception is thrown, after 
    * resource-method has been invoked. Using @provider. 
    */ 
    public CustomExceptionMapper() { 
     super(); 
    } 

    /** 
    * When exception is thrown by the jersey container.This method is invoked 
    */ 
    public Response toResponse(CustomException ex) { 
     logger.log(Level.SEVERE, ex.getMessage(), ex); 
     Response.ResponseBuilder resp = Response.status(Response.Status.BAD_REQUEST) 
         .entity(ex.getMessage()); 

     return resp.build(); 
    } 
} 

Verwenden Sie die CustomException in Ihrem Code wie folgt.

public Entity getEntityWithOptions(@PathParam("id") String id, 
            @QueryParam("option") String optValue) 
            throws CustomException { 
    if (optValue != null) { 
     // Option is an enum 
     try { 
      Option option = Option.valueOf(optValue); 
     } catch (IllegalArgumentException e) { 
      throw new CustomException(e.getMessage(),e); 
     } 
     return new Entity(option); 
    } 
    return new Entity(); 
} 

Anstelle der Nachricht können Sie auch ein Objekt erstellen und es über CustomException an den Mapper übergeben.

1

Es gibt einen wirklich einfachen Ansatz, wie unten gezeigt.

Response.ResponseBuilder resp_builder=Response.status(Response.Status.BAD_REQUEST); 
resp_builder.entity(e.getMessage());//message you need as the body 
throw new WebApplicationException(resp_builder.build()); 

wenn Sie Header hinzufügen müssen, Medientyp Reaktion oder eine andere Funktionalität, ResponseBuilder bietet sie alle.

Verwandte Themen