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을 쓰지 않아도 디스크에 쓰여진 요소를 빼앗을 수 있다고 생각합니다.
STAX 구문 분석 요구 사항이 있습니까? STAX 파싱은 앱 논리 로직으로 변환되지 않습니다 ... 사실입니다. 여전히 XML을 모든 종류의 임시 객체로 변환합니다 ... 반면에 vtd-xml은 객체 변환을 수행하지 않으며, XML로, 그리고 그것을 무작위 액세스를위한 기초로 사용 ... 당신은 효과적 일 수 있습니다 (x64 쿼리를 사용하여 (base64) 같아요 xpath 쿼리를 ... –
@ vtd-xml-author STAX는 요구 사항이 아닙니다. 들어오는 요청에서 vtd-xml을 어떻게 구현할 수 있는지에 대한 정보를 많이 얻었을 것입니다. –
일부 XML을 포함 시켜서 질문을 확장 할 수 있다면 어쩌면 코드 스 니펫 (snippet)을 일부 칩할 수 있습니까? –