2016-07-13 3 views
1

Jersey REST 서비스를 호출하는 데 사용하는 다음 클라이언트가 있습니다. 나는 내가 STAX를 사용하는 대신에 모든 변환의 디스크에 하나 개의 특정 요소를 스트리밍 할 수 있습니다 위의 서버 측 코드를 변경하려면 어떻게XML 텍스트를 Inputstream으로 가져 오는 방법

@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 개체로 끝나는 경우 동일한 메모리 문제가 발생하지 않도록하려면 어떻게해야합니까?

두 번째로 이미지 요소를 제거한 후에 vtd-xml을 사용하여 객체 또는 inputStream을 다시 구성 할 수 있습니까? 그렇다면 JAXB를 사용하여이 이미지를 처리하고 싶습니다.

XMLModifier의 remove() 메소드를 사용하면 XML에 일종의 XML을 쓰지 않아도 디스크에 쓰여진 요소를 빼앗을 수 있다고 생각합니다.

+0

STAX 구문 분석 요구 사항이 있습니까? STAX 파싱은 앱 논리 로직으로 변환되지 않습니다 ... 사실입니다. 여전히 XML을 모든 종류의 임시 객체로 변환합니다 ... 반면에 vtd-xml은 객체 변환을 수행하지 않으며, XML로, 그리고 그것을 무작위 액세스를위한 기초로 사용 ... 당신은 효과적 일 수 있습니다 (x64 쿼리를 사용하여 (base64) 같아요 xpath 쿼리를 ... –

+0

@ vtd-xml-author STAX는 요구 사항이 아닙니다. 들어오는 요청에서 vtd-xml을 어떻게 구현할 수 있는지에 대한 정보를 많이 얻었을 것입니다. –

+0

일부 XML을 포함 시켜서 질문을 확장 할 수 있다면 어쩌면 코드 스 니펫 (snippet)을 일부 칩할 수 있습니까? –

답변

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

저지에서 JAXB와 어떻게 작동하는지에 대한 질문이 더 있습니다 만, 제안에 기초한 기초적인 작업 예제를 기반으로 제 질문을 업데이트했습니다. –

관련 문제