2015-09-17 5 views
8

में संशोधित इनपुटस्ट्रीम तक पहुंचने का तरीका जानने में असमर्थ, जैसा कि How to use Jersey interceptors to get request body में चर्चा की गई है, मैं EntainInputStream को ContainerRequestFilter में संशोधित कर रहा हूं।जर्सी इनपुटस्ट्रीम फ़िल्टर में संशोधित है। जर्सी संसाधन

public filter(ContainerRequest request){ 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    InputStream in = request.getEntityInputStream(); 
    try{ 
      Readerwriter.writeTo(in, out); 
      byte[] requestEntity = out.toByteArray(); 

      // DO SOMETHING WITH BYTES HERE 

      request.setEntityInputStream(new ByteArrayInputStream(requestEntity)); 

     }/// error handling code here 
} 

हालांकि, बाद में मैं संशोधित इनपुटस्ट्रीम तक पहुंचने का तरीका नहीं समझ सकता। मैं संसाधन में ServletContext प्राप्त कर सकता हूं, लेकिन मैं यह नहीं समझ सकता कि ऑब्जेक्ट को वास्तव में फ़िल्टर में कैसे संशोधित किया गया है, ContainerRequest।

क्या मैं ऐसा कुछ कर सकता हूं? जर्सी ऊपर से शुरू नहीं कर सकते हैं जब मैं इस प्रयास करें:

@Post 
@Path("/test") 
public Response test(@Context ContainerRequest cr){ 
    // blah blah 
    return.... 
} 

जर्सी त्रुटि: विधि सार्वजनिक javax.ws.rs.core.Response example.TestController.test (com.sun के लिए

गुम निर्भरता। jersey.spi.container.ContainerRequest), संसाधन के POST के साथ एनोटेटेड, क्लास उदाहरण। testController, मान्य संसाधन विधि के रूप में पहचाना नहीं गया है।

मैं जर्सी, 1.8 के पुराने संस्करण पर फंस गया हूं, इसलिए मुझे यकीन नहीं है कि यह समस्या का हिस्सा है या नहीं।

उत्तर

1

आपको बस अपनी संसाधन विधि में इकाई निकाय के रूप में InputStream स्वीकार करना है। यदि आप चाहते हैं कि ByteArrayInputStream बस इसे डालें।

@POST 
public Response post(InputStream in) { 
    ByteArrayInputStream bin = (ByteArrayInputStream)in; 
} 

आप पहले से ही पता नहीं है, तो कैसे जर्सी अनुरोध धारा (अनुरोध शरीर के लिए) जावा प्रकार में (उदाहरण के JSON के लिए POJO करने के लिए) धर्मान्तरित MessageBodyReader रों माध्यम से है। आप JAX-RS Entity Providers पर उनके बारे में अधिक पढ़ सकते हैं।

जर्सी पहले से ही परिवर्तनीय प्रकारों के लिए कुछ मानक पाठकों के साथ आता है, उदाहरण के लिए स्ट्रिंग। अधिकांश सामग्री-प्रकार स्ट्रिंग में परिवर्तित किया जा सकता है। इसी तरह, इसमें InputStream को संभालने के लिए एक पाठक है। यह शायद सबसे आसान रूपांतरण है, क्योंकि अनुरोध पहले से ही InputStream के रूप में आ रहा है, इसलिए वास्तव में सभी पाठकों को मूल स्ट्रीम वापस करनी होगी, और यही वह तरीका है जो हमारी विधि को पारित किया जाएगा।

यदि हम InputStreamProvider कार्यान्वयन को देखते हैं, तो हम देख सकते हैं कि वास्तव में ऐसा होता है। The original stream is simply returned। और चूंकि फ़िल्टर पाठकों के सामने होता है, पाठक बस उस स्ट्रीम को वापस लौटाता है जिसे हमने सेट किया है।

यहां एक संपूर्ण उदाहरण Jersey Test Framework

public class StreamFilterTest extends JerseyTest { 

    public static class InputStreamFilter implements ContainerRequestFilter { 

     @Override 
     public ContainerRequest filter(ContainerRequest request) { 
      try { 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       InputStream in = request.getEntityInputStream(); 
       ReaderWriter.writeTo(in, out); 

       byte[] requestBytes = out.toByteArray(); 
       byte[] worldBytes = " World".getBytes(StandardCharsets.UTF_8); 
       byte[] newBytes = new byte[requestBytes.length + worldBytes.length]; 
       System.arraycopy(requestBytes, 0, newBytes, 0, requestBytes.length); 
       System.arraycopy(worldBytes, 0, newBytes, requestBytes.length, worldBytes.length); 

       request.setEntityInputStream(new ByteArrayInputStream(newBytes)); 
      } catch (IOException ex) { 
       Logger.getLogger(InputStreamFilter.class.getName()).log(Level.SEVERE, null, ex); 
       throw new RuntimeException(ex); 
      } 

      return request; 
     } 
    } 

    @Path("stream") 
    public static class StreamResource { 

     @POST 
     public String post(InputStream in) throws Exception { 
      ByteArrayInputStream bin = (ByteArrayInputStream) in; 
      StringWriter writer = new StringWriter(); 
      ReaderWriter.writeTo(new InputStreamReader(bin), writer); 
      return writer.toString(); 
     } 
    } 

    public static class AppConfig extends DefaultResourceConfig { 
     public AppConfig() { 
      super(StreamResource.class); 
      getContainerRequestFilters().add(new InputStreamFilter()); 
     } 
    } 

    @Override 
    public WebAppDescriptor configure() { 
     return new WebAppDescriptor.Builder() 
       .initParam(WebComponent.RESOURCE_CONFIG_CLASS, 
         AppConfig.class.getName()) 
       .build(); 
    } 

    @Test 
    public void should_return_hello_world() { 
     String response = resource().path("stream").post(String.class, "Hello"); 
     assertEquals("Hello World", response); 
    } 
} 

यहाँ का उपयोग कर परीक्षण निर्भरता

<dependency> 
    <groupId>com.sun.jersey.jersey-test-framework</groupId> 
    <artifactId>jersey-test-framework-grizzly2</artifactId> 
    <version>1.17.1</version> 
    <scope>test</scope> 
</dependency> 
है
संबंधित मुद्दे