2017-11-17 5 views
1

Ich habe Filter implementiert und ich habe getEntityStream von ContainerRequestContext aufgerufen und setzen Sie den genauen Wert zurück mit SetEntityStream. Wenn ich diesen Filter verwende, werden @FormParameter-Daten zu null und wenn ich keinen Filter verwende, dann ist alles in Ordnung (da ich nicht getEntityStream aufruft) und ich muss einen Filter verwenden, um Anforderungsdaten zu erfassen.@FormParameter Daten wird Null nach dem Lesen und Festlegen der gleichen Daten in ContainerRequestContext entityStream

Hinweis: Ich erhalte Formparameter von MultivaluedMap formParams, aber nicht von @FormParameter.

Umgebung: - Rest Easy API mit Jboss Wildfly 8 Server.

  @Provider 
      @Priority(Priorities.LOGGING) 
      public class CustomLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter{ 

       final static Logger log = Logger.getLogger(CustomLoggingFilter.class); 

       @Context 
       private ResourceInfo resourceInfo; 

       @Override 
       public void filter(ContainerRequestContext requestContext) 
         throws IOException { 
        MDC.put("start-time", String.valueOf(System.currentTimeMillis())); 

        String entityParameter = readEntityStream(requestContext); 

        log.info("Entity Parameter :"+entityParameter); 
       } 

       private String readEntityStream(ContainerRequestContext requestContext){ 
        ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
        final InputStream inputStream = requestContext.getEntityStream(); 
        final StringBuilder builder = new StringBuilder(); 

        int read=0; 
        final byte[] data = new byte[4096]; 
        try { 
         while ((read = inputStream.read(data)) != -1) { 
          outStream.write(data, 0, read); 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

        byte[] requestEntity = outStream.toByteArray(); 
        if (requestEntity.length == 0) { 
         builder.append(""); 
        } else { 
         builder.append(new String(requestEntity)); 
        } 
        requestContext.setEntityStream(new ByteArrayInputStream(requestEntity)); 
         return builder.toString(); 
        } 
        return null; 
       } 
      }   



    class customResource 
    { 

    //// This code is not working 
    @POST 
    @Path("voiceCallBack") 
    @ApiOperation(value = "Voice call back from Twilio") 
    public void voiceCallback(@FormParam("param") String param) 
    { 
     log.info("param:" + param); 
    } 

    // This code is working 

    @POST 
    @Path("voiceCallBackMap") 
    @ApiOperation(value = "Voice call back from Twilio") 
    public void voiceCallbackMap(final MultivaluedMap<String, String> formParams) 
    { 
     String param = formParams.getFirst("param"); 
    } 
} 

bitte schlagen Sie mir Lösung & Vielen Dank im Voraus.

Antwort

2

Ich fand während der Laufzeit, dass Instanz des Entity-Stream (von HTTP-Anfrage) vom Typ org.apache.catalina.connector.CoyoteInputStream (ich verwende jboss-as-7.1.1.Final). Aber wir setzen den Entity-Stream mit der Instanz java.io.ByteArrayInputStream. So kann Rasteasy einzelne Formulierer nicht binden.

Es gibt zwei Lösungen für diese Sie eine von ihnen verwenden können:

  1. Mit dieser Ansatz How to read JBoss Resteasy's servlet request twice while maintaing @FormParam binding?
  2. Get Form Parameter wie folgt aus:
 @POST 
    @Path("voiceCallBackMap") 
    @ApiOperation(value = "Voice call back from Twilio") 
    public void voiceCallbackMap(final MultivaluedMap<String, String> formParams) 

    { 
     String param = formParams.getFirst("param"); 
    } 
+0

Dank Es funktioniert gut. aber ich verstehe den Unterschied zwischen beiden nicht. Hast du eine Idee, warum passiert das? – user7369265

+0

bearbeitet die Antwort. –

Verwandte Themen