Ich bin zu binden, um die Open Source OWL-S API http://on.cs.unibas.ch/owls-api/ Axis2 zu verwenden. Ich habe es geschafft, die Anfragen korrekt zu senden, aber wenn es um die Antwort geht, habe ich Probleme, eine Transformation darauf anzuwenden. Um meine Frage leichter beantworten zu können, stelle ich einen eigenständigen Code zur Verfügung, der ausgeführt werden sollte, ohne dass das Projekt importiert werden muss. Zum Einrichten der DOMSource:Eine xalan-java-Umwandlung auf ein axis2-Objekt anwenden?
String xmlString = "<ns1:countResponse xmlns:ns1=\"http://www.test.de/pill-counter\"><ns1:value>0</ns1:value><ns1:value>0</ns1:value><ns1:value>1</ns1:value><ns1:value>0</ns1:value><ns1:value>0</ns1:value><ns1:value>0</ns1:value></ns1:countResponse>";
ByteArrayInputStream xmlStream = new ByteArrayInputStream(xmlString.getBytes());
OMElement test = null;
try {
StAXBuilder builder = new StAXOMBuilder(xmlStream);
test = (OMElement) builder.getDocument().getChildren().next();
} catch (XMLStreamException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
OMElement documentElement = null;
try {
documentElement = AXIOMUtil.stringToOM(DOOMAbstractFactory.getOMFactory(), xmlString);
} catch (XMLStreamException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
SAAJConverterFactory convFactory = (SAAJConverterFactory) FactoryRegistry.getFactory(org.apache.axis2.jaxws.message.factory.SAAJConverterFactory.class);
SAAJConverter conv = convFactory.getSAAJConverter();
//Create soap 1.1 message
SOAPMessage msg = MessageFactory.newInstance().createMessage();
SOAPPart sp = msg.getSOAPPart();
SOAPEnvelope se = sp.getEnvelope();
SOAPBody soapBody = se.getBody();
javax.xml.soap.SOAPFactory soapFactory = javax.xml.soap.SOAPFactory.newInstance();
response = conv.toSAAJ(documentElement, soapBody, soapFactory);
Node root = response;
Und nun die Transformation anzuwenden:
Transformer transformer = null;
try {
transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(new StringReader("<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:ns1=\"http://www.test.de/pill-counter\">\n\n\t<xsl:template match=\"/\">\n\t\t<xsl:value-of select=\"sum(*/ns1:value)\" />\n\t</xsl:template>\n</xsl:stylesheet>")));
} catch (TransformerConfigurationException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
} catch (TransformerFactoryConfigurationError e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
transformer.transform(new DOMSource(root), new StreamResult(System.out));
} catch (TransformerException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Das Ergebnis dieses Code ausgeführt wird, ein Nullpointer.
SystemId unknown; Line num.0; Column num.0; java.lang.NullPointerException
Ich habe versucht, eine Lösung auf Google für dieses Problem suchen, die Xalan-j Mailing-Liste und auf dieser Seite ohne Glück. Ich habe auch mit mehreren anderen Codierungsansätzen versucht und kein Glück. Irgendwelche Ideen von irgendjemandem?
fand ich eine andere Art und Weise diese Funktion zu erhalten, indem das Dokument von Grund auf neu zu erzeugen:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(false);
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
}
InputSource is = new InputSource(new StringReader(documentElement.toString()));
Document document = null;
try{
document=db.parse(is);
} catch (SAXException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
} catch (IOException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
}
Können Sie bitte Informationen über die Axis2- und Axiom-Version hinzufügen, die Sie verwenden? –
Hallo, ich benutze die neueste Achsenversion axis2-1.6.1 und Axiom 1.2.12, jede Hilfe wäre willkommen – m1416
Ich habe meine Antwort so bearbeitet, dass sie auf Axiom 1.2.12 zutrifft. –