2016-10-20 6 views
4

Ich versuche, einen RequestDispatcher mit DropWizard zu implementieren, die Entität im Körper auf Beiträge betrachten und bestimmte Statistiken berechnen soll.Trikot requestdispatcher Ausführungsreihenfolge

so implementiert ich eine ResourceMethodDispatchAdapter und ResourceMethodDispatchProvider und ich bin in der Lage, erfolgreich zu injizieren und meine Request aufrufen,

private static class InspectRequestDispatcher implements RequestDispatcher { 

    private final RequestDispatcher dispatcher; 

    private InspectRequestDispatcher(RequestDispatcher dispatcher) { 
     this.dispatcher = dispatcher; 
    } 

    @Override 
    public void dispatch(final Object resource, final HttpContext context) { 
     final Saying day = context.getRequest().getEntity(Saying.class); 
     dispatcher.dispatch(resource, context); // this throws ConstraintViolationException 
    } 
} 

Der obige Code Ausnahme auslöst, da ich bereits den Körper gelesen haben (was verständlich ist), Ich könnte den Stream zurücksetzen, aber dann werde ich die Strafe für das Lesen des Körpers zweimal bezahlen.

Ist es möglich, Methodenaufruf AFTER Parameter injiziert wurden? Plane diesen Abfangjäger irgendwie als den letzten?

mit dropwizard 7 Version

Antwort

2

Wenn Sie einen ContainerRequestFilter anstelle eines RequestDispatcher verwenden, könnten Sie nutzen die CachedEntityContainerRequest machen, die für genau gemeint ist.

Eine zwischengespeicherte Entitätsinterne HTTP-Anforderung, die die aus der angepassten Containeranforderung erhaltene Entitätsinstanz zwischenspeichert.

Ein Filter kann diese Klasse verwenden, wenn eine Entität eines bestimmten Typs erforderlich ist und derselbe Typ auch von einer Ressourcenmethode verwendet wird.

Sie würden es im Grunde wie so verwenden:

@Provider 
public class StatsFilter implements ContainerRequestFilter { 
    @Override 
    public ContainerRequest filter(ContainerRequest request) { 
     final CachedEntityContainerRequest cachedRequest 
       = new CachedEntityContainerRequest(request); 

     final Saying saying = cachedRequest.getEntity(Saying.class); 

     return cachedRequest; 
    } 
} 

Dann registrieren Sie den Filter.