2010-10-12 6 views
6

Ich habe eine Reihe von Klassen als JAX-RS Anfrage "Handler" ausgesetzt, mit javax.ws.rs.Path Annotationen. Ich möchte bestimmte Aktionen vor jeder Anfrage und nach jeder Anfrage hinzufügen. Außerdem muss ich einen globalen applikationsweiten Exception-Handler erstellen, der alle von diesen Handlern und dem Protokoll ausgelösten Daten abfängt.Kann ich alle JAX-RS-Anforderungen mit benutzerdefiniertem Code für Vorabversand, Nachversand und Fehlerbehandlung umbrechen?

Ist es möglich, dies mit dem Standard JAX-RS zu erreichen, ohne eine benutzerdefinierte Klasse zu erstellen, die von com.sun.jersey.spi.container.servlet.ServletContainer übernommen wurde (ich benutze Jersey).

+0

Die akzeptierte Antwort bezieht sich nicht auf Ihre Wunsch nach Pre- und Post-Request-Aktionen. Bist du jemals zu einer Lösung gekommen? –

+0

Benutzerdefiniert [Servlet Filter] (http://download.oracle.com/javaee/5/api/javax/servlet/Filter.html) ist der Weg zu gehen. – yegor256

Antwort

2

Sie können auch ExceptionMapper verwenden. Dieser Mechanismus, der die Ausnahme von Ihrem Service geworfen zu fangen und sie an die entsprechende Antwort konvertieren:

@Provider 
public class PersistenceMapper implements ExceptionMapper<PersistenceException> { 

    @Override 
    public Response toResponse(PersistenceException arg0) { 
     if(arg0.getCause() instanceof InvalidDataException) { 
      return Response.status(Response.Status.BAD_REQUEST).build(); 
     } else { 
      ... 
     } 
    } 

} 

Weitere Informationen finden Sie unter:

0

Sie können filters verwenden, um alle Anfragen und Antworten zu lesen und zu ändern.

+0

Sieht aus wie Filter können nur von Kunden verwendet werden! – fjsj

1

Sie könnten einen Proxy-RESTful-Service erstellen und diesen als Einstiegspunkt für alle anderen RESTful-Services verwenden. Dieser Proxy kann Anfragen empfangen, jegliche Vorverarbeitung durchführen, den erforderlichen REST-Dienst aufrufen, die Antwort verarbeiten und dann dem Anrufer etwas zurückgeben.

Ich habe so ein Setup in einem Projekt, an dem ich gearbeitet habe. Der Proxy führt Funktionen wie Authentifizierung, Autorisierung und Audit-Protokollierung aus. Ich kann auf weitere Details eingehen, wenn Sie möchten.

Bearbeiten:
Hier ist eine Idee, wie Sie möglicherweise einen Proxy implementieren, der GET-Anforderungen unterstützt;

@Path("/proxy") 
public class Proxy 
{ 
private Logger log = Logger.getLogger(Proxy.class); 

@Context private UriInfo uriInfo; 

@GET 
@Path("/{webService}/{method}") 
public Response doProxy(@Context HttpServletRequest req, 
       @PathParam("webService") String webService, 
       @PathParam("method") String method) 
{ 
    log.debug("log request details"); 

    //implement this method to work out the URL of your end service 
    String url = constructURL(req, uriInfo, webService, method); 

    //Do any actions here before calling the end service 

    Client client = Client.create(); 
    WebResource resource = client.resource(url); 

    try 
    { 
     ClientResponse response = resource.get(ClientResponse.class); 
     int status = response.getStatus(); 
     String responseData = response.getEntity(String.class); 

     log.debug("log response details"); 

     //Do any actions here after getting the response from the end service, 
     //but before you send the response back to the caller. 

     return Response.status(status).entity(responseData).build(); 
    } 
    catch (Throwable t) 
    { 
     //Global exception handler here 
     //remember to return a Response of some kind. 
    } 
} 
+0

Klingt wie eine Lösung, aber wie werden Sie die Antwort "verarbeiten"? Können Sie ein Beispiel für diesen RESTful Proxy geben? – yegor256