2014-10-11 5 views
5

Ich muss den Inhalt der Json Anfrage an einen Dropwizard-Dienst gesendet lesen. Die Nachricht selbst wird durch den Dropwizard zu dem mit Anmerkungen versehenen Objekt serialisiert, welches die Eingabe der Methode (PaymentMessage Objekt) ist. Ich habe den HttpServletRequest als Eingabeparameter der Methode hinzugefügt. Die HttpServletRequest ist nicht null, aber die Methode HttpServletRequest#getInputStream() gibt einen Null-leeren-Stream zurück.Lesen Körper einer Anfrage an einen Dropwizard-Service gesendet

Die Locke: curl -i -X POST -H'Content-Type: application/json; charset=UTF-8' \ http://localhost:8080/NL/users/555855/payments -d '{"eventId":"110099110099","hznHouseholdId":"1234567_nl","ipAddress":"123.123.123.123","transactionId":"799ef666-e09c-8350-247b-c466997714ad","transactionDate":"2014-09-29T16:56:21Z","appName":"Flappy Bird"}'

Der Code:

@POST 
@Path("/{countryCode}/users/{customerId}/payments") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public Response processPaymentAction(
     @Context final HttpServletRequest request, 
     @Nonnull @PathParam("countryCode") final String countryCode, 
     @Nonnull @PathParam("customerId") final String customerId, 
     @Valid PaymentMessage paymentMessage) 
     throws IOException, ServletException { 

    LOG.debug("Request "+request.toString()); 
    final ByteSource byteSource = new ByteSource() { 
     @Override 
     public InputStream openStream() throws IOException { 
      return request.getInputStream(); 
     } 
    }; 
    LOG.debug("charset "+request.getCharacterEncoding()); 
    final String contents = byteSource.asCharSource(Charset.forName(request.getCharacterEncoding())).read(); 
    LOG.debug("contents: "+contents); 
    return Response.status(Response.Status.ACCEPTED).build(); 
} 
+0

Der Post-Body sollte der PaymentMessage zugeordnet werden, wie Sie sagten. Was willst du aus dem Anfrageobjekt herausholen, das noch nicht Teil des POJO ist, das Jackson für dich hätte kartieren sollen? – th3morg

+0

Ich habe versucht, den Körper der Nachricht in String-Form und serialisiert zu einem POJO-Objekt zu bekommen, weil 1. Ich wollte den Körper verwenden, um die MD5-Summe der Anfrage zu validieren 2. Ich wollte die Eingabe serialisiert zu einem haben Objekt, weil Objekte einfach einfacher zu benutzen sind :) –

Antwort

5

Sie können PaymentMessage paymentMessage Parameter String paymentMessage ändern, die die JSON-String sein sollte. Dann wird es keine Validierung geben, noch wirst du den POJO direkt haben.

+0

Ja, Am Ende ist das, was ich getan habe, Deserialisierung der Schnur selbst zum POJO. –

Verwandte Themen