2016-07-13 3 views
1

私はJersey RESTサービスを呼び出すために使用している次のクライアントを持っています。私は、私はスタックスを使用して、代わりにすべての変換のディスクにある特定の要素をストリーミングすることができます上記のサーバー側のコードを変更するにはどうすればよいInputstreamとしてXMLテキストを取得する方法

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

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(); 
    } 
} 

は現在、サーバー側で私は次の持っていますオブジェクトをメモリに格納します。私の目標は、バイナリエンコーディングデータを含むこの要素をディスクにストリームすることです。

私が受け取るペイロードは、このようなものです:からのアドバイスに従い

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

@ VTD-XML-著者

私は今、次があります。

サーバー側:

@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(); 
     } 

と私はこれを持っています:

File file = new File("E:/postx.xml"); 
     FileInputStream fileInStream = null; 

      fileInStream = new FileInputStream(file); 

     ClientConfig config = new DefaultClientConfig(); 
     Client  client = Client.create(config); 
     WebResource service = client.resource(getBaseURI()); 

     String tempImage = myfile.jpg; 

     String sContentDisposition = "attachment; filename=\"" + tempImage+"\""; 

     ClientResponse response = service.type(MediaType.APPLICATION_OCTET_STREAM) 
             .header("Content-Disposition", sContentDisposition) 
             .post(ClientResponse.class, fileInStream); 

私はデコードする必要があるヒープのStringオブジェクトで終わる場合、最初にどのように正確に同じメモリの問題を避けるのですか?

2番目に、イメージ要素を削除したら、vtd-xmlを使用してオブジェクトまたはinputStreamを再構成できますか?JAXBを使用してこれを処理したいのですが?

XMLModifierのremove()メソッドは、私が今ディスクに書き込んだ要素を除いた何らかのXMLを表すことができるはずだと思います。

+0

STAXが要件を解析していますか? STAXの解析はアプリケーションロジックロジックに変換されません...これは真実ですが、XMLをフード内のあらゆる種類の一時オブジェクトに変換します...一方、vtd-xmlはオブジェクト変換を行わず、 XMLをそのまま使用し、ランダムアクセスの基礎として使用してください...バイナリエンコーディングを有効にすることができます(おそらく(base64)とxpathクエリーの両方で)... –

+0

@ vtd-xml-author STaXは必須ではありません。 –

+0

いくつかのXMLコードを含めることで質問を拡張できるのであれば、おそらくコードスニペットでチップすることができますか? –

答えて

1

私はあなたのコードでHTTPプロトコルとのインターフェース方法を知っていると仮定します。あなたはバイトストリームをバイトバッファに読み込む方法を知っています...次のコードはそのポイントを引き継ぐでしょう...

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

JerseyのJAXBでどのように動作するのかという疑問がありますが、あなたの提案に基づいた初歩的な作業例に基づいてコードで質問を更新しました。 –

関連する問題