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.
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 ... –
@ 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. –
Wenn Sie Ihre Frage erweitern können, indem Sie XML einbinden, kann ich vielleicht ein Code-Snippet einbinden? –