2012-04-12 4 views
0

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

Können Sie bitte Informationen über die Axis2- und Axiom-Version hinzufügen, die Sie verwenden? –

+0

Hallo, ich benutze die neueste Achsenversion axis2-1.6.1 und Axiom 1.2.12, jede Hilfe wäre willkommen – m1416

+0

Ich habe meine Antwort so bearbeitet, dass sie auf Axiom 1.2.12 zutrifft. –

Antwort

0

Um die JAXP-API in einem Axiom-Baum zu verwenden, müssen Sie sie nicht zuerst in SAAJ oder DOM konvertieren. Axiom kann eine SAXSource erstellen, die an JAXP übergeben werden kann. Ein Beispiel kann here gefunden werden. In diesem Beispiel wird die javax.xml.validation API verwendet, aber für javax.xml.transform funktioniert es genauso.

Beachten Sie, dass das Beispiel einige APIs verwendet, die in den letzten Axiom-Versionen eingeführt wurden, aber das Feature existiert bereits seit einiger Zeit. Abhängig von der Axiom-Version, die Sie verwenden, muss der Code an die ältere API angepasst werden. Insbesondere, anstatt getSAXSource (die in 1.2.13 eingeführt wurde) aufzurufen, müssen Sie ein org.apache.axiom.om.impl.jaxp.OMSource-Objekt erstellen und dieses an JAXP übergeben.

+0

Hallo, Sie haben Recht der Code funktioniert ohne Ausnahme, wenn ich den Transformator wie folgt aufrufen: 'transformer.transform (neue OMSource (documentElement), neue StreamResult (System.out)); 'Ich bin einen Schritt näher, aber die Ausgabe ist nicht das, was ich erwarten würde, es ist nur ** 1 ** – m1416

+0

Versus der korrekte Ausgabe: ** 001000 ** – m1416

+0

Ich habe die ursprüngliche Frage mit dem Code bearbeitet, der die korrekte Ausgabe erzeugt. Beim Durchlaufen der AXIOM-API wird angegeben, dass der SAX-Content-Handler die Namespace-Zuordnung für das Präfix ns kennen muss. Das Namespace-Mapping wird automatisch von AXIOM hinzugefügt, aber vielleicht fehlt mir noch etwas, damit dies funktioniert. Vielen Dank für Ihre weitere Hilfe. – m1416

0

Haben Sie mit wsdl2java als Stubs zu konstruieren, sondern dass die Low-Level-API direkt verwenden? Dies würde Ihnen erlauben, die Antwort in Java zu manipulieren. Die Verwendung von xslt scheint in diesem Fall ein ungewöhnlicher Ansatz zu sein.

+0

Die Art und Weise, wie ich den Code verwende funktioniert Ich bin mit der Low-Level-API fest – m1416

Verwandte Themen