2012-01-23 25 views
5

Tôi đã tìm kiếm trên mạng trong vài giờ ngay bây giờ, cố gắng tìm một cách đơn giản để xác nhận một thông điệp SOAP đầy đủ dựa vào WSDL. Tôi biết rằng có nhiều cách để thực hiện điều này với các khung công tác Dịch vụ Web khác nhau, nhưng tôi không muốn làm điều này vì yêu cầu chỉ đơn giản là xác nhận hợp lệ một đoạn XML. Tôi có thể xác nhận hợp lệ đối với lược đồ, mặc dù vấn đề tôi có là có một số lược đồ được nhập vào WSDL và tôi không biết mình nên xác nhận hợp lệ nào. Tôi có thể viết một số tiện ích để xử lý đầu tiên WSDL và đáp ứng để xác định XSD nào để xác thực, nhưng tôi cho rằng điều này có thể được thực hiện như một lớp lót bằng cách sử dụng một thư viện được thiết lập!Xác thực thông báo SOAP chống lại WSDL với nhiều XSD's

Có ai biết một cách tương đối đơn giản để xác nhận hợp lệ một tài liệu XML được cung cấp cho WSDL và nhiều XSD không?

Trả lời

4

Trong dự án trước, tôi đã giải quyết vấn đề này bằng cách phân tích cú pháp tệp WSDL và trích xuất các lược đồ từ nó. Mã này giống như sau, nó giả định rằng WSDL đã được đọc vào biến Nguồn "wsdlSource" theo một cách nào đó và các không gian tên đã nhập được khai báo trong lược đồ "lược đồ". Nó có thể là một ý tưởng tốt để thực hiện điều này một lần khi khởi động và sau đó thực hiện xác nhận trong SOAPHandler.

//First create a document from the WSDL-source 
    DocumentBuilder db = DocumentBuilderFactory.newInstance() 
       .newDocumentBuilder(); 
    Document wsdlDoc = db.newDocument(); 

    TransformerFactory transformerFactory = TransformerFactory 
       .newInstance(); 
    Transformer transformer = transformerFactory.newTransformer(); 
    transformer.transform(wsdlSource, new DOMResult(wsdlDoc)); 

    //Now get the schemas from the WSDL 
    NodeList schemaNodes = wsdlDoc.getElementsByTagNameNS(
      XMLConstants.W3C_XML_SCHEMA_NS_URI, "schema"); 

    int nrSchemas = schemaNodes.getLength(); 

    Source[] schemas = new Source[nrSchemas]; 

    for (int i = 0; i < nrSchemas; i++) { 
     schemas[i] = new DOMSource(schemaNodes.item(i)); 
    } 

    SchemaFactory schemaFactory = SchemaFactory 
      .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

    //Now we have a schema that can validate the payload 
    Schema schema = schemaFactory.newSchema(schemas); 
    Validator validator = schema.newValidator(); 
+0

Có vẻ như cách tiếp cận duy nhất hiện nay! Cảm ơn bạn đã trích đoạn nội dung. – Ellis

0

Không có cách nào thuận tiện để thực hiện việc này. Không có thư viện nguồn mở nào mà tôi có thể tìm thấy. Tôi đã sử dụng công cụ XML Pack trong IBM Info sphere để làm điều này. Điều này thực hiện một công việc khá tốt để nhập các tệp wsdls và xsds và xác nhận hợp lệ dữ liệu xml hoặc tải dữ liệu XML và chuyển chúng thành tệp phẳng. Bạn có thể thấy liên kết này hữu ích: http://www.ibm.com/developerworks/data/library/techarticle/dm-1103datastages/index.html

+0

Cảm ơn bạn đã trả lời, mặc dù tôi không nghĩ rằng đây sẽ bay cho rằng những gì tôi đang cố gắng làm ở đây là đơn giản hóa một tiện ích mà hiện đang sử dụng một khuôn khổ toàn diện để xác nhận một thông điệp SOAP – Ellis

+0

Đây là một thư viện mà chúng tôi đã sử dụng: http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html trong triển khai hiện tại của chúng tôi. – codegenx

+0

Tôi không thấy bất kỳ điều gì về việc xác thực WSDL trên trang đó. – Ellis

Các vấn đề liên quan