2016-07-12 15 views
1

Also ich bin eine mvc-Anwendung mit Jersey bauen. Eine Methode, die Path-Parameter akzeptiert (@PathParam).Jersey Exception Mapping verschiedenen Kontext

Wenn eine benutzerdefinierte Ausnahme ausgelöst wird (ExampleException), wird eine 404 Not Found-Antwort mit einem Exception Mapper zurückgegeben.

@Provider 
public class ExampleExceptionMapper implements ExceptionMapper<ExampleException> { 
    @Override 
    public Response toResponse(ExampleException ex) { 
     return Response.status(Status.NOT_FOUND).entity("Not Found - " + ex.getMessage()).build(); 
    } 

} 

Allerdings implementiere ich @ FormParam so einen Benutzer POSTs an den Server. Die gleiche genaue Ausnahme wird ausgelöst, stattdessen sollte ich eine 400 Bad Request-Antwort zurückgeben. Ohne die Ausnahme zu ändern, wie würde ich in der Lage sein, den Exception Mapper den richtigen Antwortcode zurückzugeben?

Antwort

1

Der einfachste Weg besteht darin, mehrere ExceptionMapper zu erstellen, jede für eine bestimmte Unterklasse von ExampleException.

Aber Sie wollen für beide Fälle die gleiche Ausnahme haben und entscheiden, ob 404 werfen für GET/PathParam und POST/FormParam, können Sie die request in den Mapper injizieren und überprüfen, welche Methode es ist:

@Provider 
public class ExampleExceptionMapper implements ExceptionMapper<ExampleException> { 
    @Context Request request;   
    @Override 
    public Response toResponse(ExampleException ex) { 
     if ("POST".equals(requset.getMethod())) 
      return Response.status(Status.BAD_REQUEST).build(); 
     else 
      return Response.status(Status.NOT_FOUND).entity("Not Found - " + ex.getMessage()).build(); 
    } 
} 

Wenn Sie mit dem PathParams entscheiden möchten, können Sie UriInfo injizieren:

@Provider 
public class ExampleExceptionMapper implements ExceptionMapper<ExampleException> { 
    @Context UriInfo info;   
    @Override 
    public Response toResponse(ExampleException ex) { 
     if (info.getPathParameters().isEmpty())) //please make better condition based on your needs 
      return Response.status(Status.BAD_REQUEST).build(); 
     else 
      return Response.status(Status.NOT_FOUND).entity("Not Found - " + ex.getMessage()).build(); 
    } 
}