2012-04-12 2 views
0

오픈 소스 OWL-S API http://on.cs.unibas.ch/owls-api/을 사용하여 axis2를 사용하고자합니다. 요청을 올바르게 보내도록 관리했지만 응답이 오면 응답을 변환하는 데 문제가 있습니다. 내 질문에 대답하기 쉽게하기 위해 프로젝트를 가져 오지 않고도 실행해야하는 독립 실행 형 코드를 제공하고 있습니다. DOMSource 인을 설정하려면 :xalan 자바 변환을 axis2 객체에 적용 하시겠습니까?

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; 

그리고 지금은 변환을 적용하는 :

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

이 코드를 실행의 결과는 NullPointerException이있다.

SystemId unknown; Line num.0; Column num.0; java.lang.NullPointerException 

내가 구글의의 Xalan-J 메일 ​​링리스트와 행운이 사이트에서이 문제에 대한 해결책을 찾고 노력했다. 나는 또한 여러 다른 코딩 방법과 운이없는 시도했다. 누구의 아이디어라도?

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

사용중인 Axis2 및 Axiom 버전에 대한 정보를 추가 할 수 있습니까? –

+0

안녕하세요, 최신 축 버전 axis2-1.6.1과 공리 1.2.12를 사용하고 있습니다. 도움을 받으려면 – m1416

+0

Axiom 1.2.12에 적용 할 수 있도록 내 대답을 편집했습니다. –

답변

0

Axiom 트리에서 JAXP API를 사용하려면 먼저 SAAJ 또는 DOM으로 변환 할 필요가 없습니다. Axiom은 JAXP에 전달할 수있는 SAXSource를 생성 할 수 있습니다. 예는 here입니다. 이 예에서는 javax.xml.validation API를 사용하지만 javax.xml.transform의 경우 동일한 방식으로 작동합니다.

이 예제에서는 최근의 Axiom 버전에 도입 된 일부 API를 사용하지만이 기능은 이미 상당 기간 동안 존재합니다. 사용중인 Axiom 버전에 따라 코드를 이전 API에 맞게 조정해야합니다. 특히 getSAXSource (1.2.13에서 도입)을 호출하는 대신 org.apache.axiom.om.impl.jaxp.OMSource 객체를 생성하여 JAXP에 전달해야합니다.

+0

안녕하세요,이 코드는 다음과 같이 트랜스포머를 호출하면 예외없이 작동합니다 :'transformer.transform (new OMSource (documentElement), new StreamResult (System.out));'한 걸음 더 가까이 있지만 결과는 단지 ** 1 ** – m1416

+0

올바른 출력 : ** 001000 ** – m1416

+0

올바른 결과를 생성하는 코드를 사용하여 원래 질문을 편집했습니다. AXIOM API를 살펴보면 SAX 컨텐트 핸들러가 ns 접두어에 대한 네임 스페이스 매핑을 알고 있어야한다고 말합니다. 네임 스페이스 매핑은 AXIOM에 의해 자동으로 추가되었지만, 아직 작동하지 않게 될 수도 있습니다. 이 문제에 대해 많은 도움을 주셔서 대단히 감사합니다. – m1416

0

당신이 스텁을 구성하는 WSDL2Java의를 사용하여, 오히려 그 직접적으로 낮은 수준의 API를 사용하여 고려 유무 :

나는 처음부터 문서를 생성하여이 작업을 얻을 수있는 다른 방법을 찾았나요? 이렇게하면 Java에서 응답을 쉽게 조작 할 수 있습니다. xslt를 사용하는 것은이 경우 비정상적인 접근 방법처럼 보입니다.

+0

내가 사용하는 코드가 저수준 API에 붙어 있습니다. – m1416