2016-07-13 16 views
1

Ich habe den folgenden Client, den ich verwende, um einen Jersey-REST-Dienst aufzurufen.So erhalten Sie XML-Text als Eingangsstrom

public class JerseyClient { 
    public static void main(String[] args) { 
     ClientConfig config = new DefaultClientConfig(); 
     Client  client = Client.create(config); 
     WebResource service = client.resource(getBaseURI()); 
     String  response = service.accept(MediaType.TEXT_XML) 
             .header("Content-Type", "text/xml; charset=UTF-8") 
             .entity(new File("E:/postx.xml")) 
             .post(String.class); 

     System.out.println(response); 
    } 

    private static URI getBaseURI() { 
     return UriBuilder.fromUri("http://localhost:8080/MyService/rest/xmlServices/doSomething").build(); 
    } 
} 

Derzeit auf der Server-Seite habe ich die folgenden:

@POST 
    @Path("/doSomething") 
    @Consumes(MediaType.TEXT_XML) 
    @Produces(MediaType.TEXT_XML) 
    public Response consumeXMLtoCreate(ProcessJAXBObject jaxbObject) { 

Wie kann ich den oben Server-seitigen Code ändern, so kann ich Stax verwenden und stattdessen auf der Festplatte ein bestimmtes Element strömen alle Umwandlung in Objekte in den Speicher. Mein Ziel ist es, dieses Element, das binäre Kodierungsdaten enthält, auf die Festplatte zu streamen.

Die Nutzlast I erhalten ist wie folgt:

<?xml version="1.0" encoding="utf-8"?> <ProcessRequest> <DeliveryDate>2015-12-13</DeliveryDate> <AttachmentBinary>iVBORw0KGgoAAAANSUhEUgAAAFoA</AttachmentBinary> <AttachmentBinary>iVBORw0KGgoAAAANSUhEUgAAAFoA</AttachmentBinary> </ProcessRequest> 

Auf Anraten von @ vtd-xml-Autor

Ich habe nun folgendes:

Server-Seite:

@POST 
    @Produces(MediaType.TEXT_XML) 
    @Path("/doSomething") 
    @Consumes(MediaType.APPLICATION_OCTET_STREAM) 
    public Response consumeXMLtoCreate(@Context HttpServletRequest a_request, 
      @PathParam("fileId") long a_fileId, 
      InputStream a_fileInputStream) throws IOException { 

     InputStream is; 
     byte[] bytes = IOUtils.toByteArray(a_fileInputStream); 

     VTDGen vg = new VTDGen(); 
     vg.setDoc(bytes); 
     try { 
      vg.parse(false); 
     } catch (EncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (EOFException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (EntityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }// 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     try { 
      ap.selectXPath("/ProcessRequest/BinaryAttachment/text()"); 
     } catch (XPathParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     int i=0; 
     try { 
      while((i=ap.evalXPath())!=-1){ 
       //i points to text node of 
       String s = vn.toRawString(i); 
       System.out.println("HAHAHAHA:" + s); 
       // you need to decode them 
      } 
     } catch (XPathEvalException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NavException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

und Client-Seite Ich habe dies:

Ich habe Fragen, die sich aus dieser Lösung ergeben, erstens, wie genau vermeide ich die gleichen Speicherprobleme, wenn ich mit einem String-Objekt im Heap komme, das ich entschlüsseln muss?

Zweitens kann ich ein Objekt oder inputStream mit vtd-xml wiederherstellen, nachdem ich die Bildelemente entfernt habe, wie ich dies dann mit JAXB verarbeiten möchte?

Ich glaube, XMLModifiers remove() - Methode sollte mir erlauben, eine Art von XML zu haben minus das Element, das ich jetzt auf die Festplatte geschrieben habe.

+0

Ist STAX Parsing eine Anforderung? STAX Parsing konvertiert nicht in Ihre App Logik Logik ... das ist wahr, es konvertieren immer noch XML in allerlei temporäre Objekte unter der Haube ... Auf der anderen Seite, vtd-xml macht keine der Objektkonvertierung, es behält XML als es, und verwenden Sie es als Basis für den wahlfreien Zugriff ... Sie können effektiv Ihre binäre Codierung (ich vermute (Base64) mit einer XPath-Abfrage ... –

+0

@ vtd-xml-Autor STaX ist keine Voraussetzung. Any Informationen darüber, wie ich vtd-xml aus der eingehenden Anfrage implementieren kann, werden sehr geschätzt. –

+0

Wenn Sie Ihre Frage erweitern können, indem Sie XML einbinden, kann ich vielleicht ein Code-Snippet einbinden? –

Antwort

1

Ich nehme an, Sie wissen, wie Sie mit HTTP-Protokoll in Ihrem Code..so wissen Sie, wie Sie die Bytes aus dem Eingangsstrom in einen Byte-Puffer lesen ... der folgende Code übernimmt von diesem Punkt ...

public void readBinaryAttachment(HTTPInputStream input) throws VTDException, IOException{ 
// first read xml bytes into XMLBytes 
.... 
VTDGen vg = new VTDGen(); 
vg.setDoc(XMLBytes); 
vg.parse(false);// 
VTDNav vn = vg.getNav(); 
AutoPilot ap = new AutoPilot(vn); 
ap.selectXPath("/ProcessRequest/BinaryAttachment/text()"); 
int i=0; 
while((i=ap.evalXPath())!=-1){ 
    //i points to text node of 
    String s = vn.toRawString(i); 
    // you need to decode them 
} 

} 
+0

Ich habe meine Frage mit Code basierend auf einem rudimentären Arbeitsbeispiel aktualisiert, das auf Ihrem Vorschlag basiert, obwohl ich weitere Fragen habe, wie dies mit JAXB in Jersey funktionieren kann. –