【问题标题】:Java. Validate SOAP message against a WSDL爪哇。根据 WSDL 验证 SOAP 消息
【发布时间】:2011-09-02 09:49:16
【问题描述】:

我需要根据WSDL 验证 SOAP 消息吗? (就像XML 文件可以针对XSD 架构进行验证一样)。

我没有调用任何网络服务; 我只有一条SOAP 消息和一条WSDL,我需要验证SOAP 消息是否正确。 无需调用网络服务或之后的任何操作。

我需要在 Java 程序中进行验证。 你知道有一个小型 Java 库可以做到这一点吗?

ps:我知道有几个JAX-WS 库可以在您调用网络服务时验证请求/响应。但同样,我没有调用任何网络服务;我有一个简单的SOAP 消息和一个WSDL,我需要一个函数来验证SOAP 消息与WSDL 的对比。

ps:我也知道有一些工具可以做到这一点,例如SOAPUIXMLSpy。同样,我需要在我的 Java 程序中进行此验证。

ps:我知道我可以提取SOAP 消息的正文部分,并根据XSD 对其进行验证。但是,我想根据WSDL 验证整个SOAP 消息。

【问题讨论】:

  • 您是要根据 specific WSDL 验证 SOAP 消息,还是要创建通用代码来根据任何 WSDL 验证任何 SOAP 消息?
  • user384706,第二个选项;第一个选项会更简单吗?

标签: java web-services


【解决方案1】:

【讨论】:

  • 你能解释更多吗?
【解决方案2】:

如果您使用基于 Apache CXF 或 Apache Axis 2 的代码生成器创建 Web 服务客户端,那么只要 Web 服务提供者和您的客户端使用相同版本的SOAP/WS* 标准。根据您选择调用 Web 服务的 API,您可以查看该 API 的日志记录功能是否可用于打印生成的 SOAP 请求。

另一种方法是使用像 SOAPUI 这样的工具。您可以尝试使用基于您拥有的 WSDL 的 SOAP UI 设置模拟 Web 服务,然后通过调用模拟服务来调用测试您的 Web 服务客户端。在此处查看 SOAP UI 链接 http://www.soapui.org/Getting-Started/web-service-sample-project/1-Web-Service-Mocking.html

【讨论】:

    【解决方案3】:

    您可以使用您拥有的 WSDL 创建一个存根,然后使用您的 XML 请求对存根进行查询。如果一切顺利,您的请求是正确的。

    您可以在项目中导入 WSDL,然后使用您的 XML 调用存根服务。这样您就可以在不更改代码的情况下更改验证。

    【讨论】:

      【解决方案4】:

      试试这个

      1. 使用 WSDL 并创建 Jax-RPC 代理
      2. 创建 Web 服务 JAX RPC 处理程序并将其注册到 Web 服务引用 请参考this link 了解如何创建 Web 服务处理程序
      3. 在处理程序中,尝试以下代码 在public boolean handleRequest(MessageContext mc) 中添加这些行

        mc.setProperty("USE_TEST_FILE", <your response in .xml file>);
        return false;
        
      4. public boolean handleResponse(MessageContext mc)

        String testFileName = (String) mc.getProperty("USE_TEST_FILE");
        InputStream instream = <read file as an input stream>
        SOAPMessageContext smc = (SOAPMessageContext) mc;
        SOAPMessage message = smc.getMessage();
        SOAPPart soapPart = message.getSOAPPart();
        soapPart.setContent(new StreamSource(instream));
        smc.setMessage(message);
        return false;
        

      现在运行您的代理。如果消息对于每个 WSDL 无效,则代理将失败

      【讨论】:

        【解决方案5】:

        我认为您可能正在寻找一个对于您真正需要的东西来说过于复杂的答案。您真正需要做的就是注册适当的 DTD/XSD 文档,以便普通的 JAXP 类可以引用它们。

        这段代码来自Sun/Oracle,实现了一个基本的EntityResolver。您需要构建此类,以便为您尝试验证的文档中定义的架构提供DocumentBuilder 和适当的InputSources。

        import org.xml.sax.EntityResolver;
        import org.xml.sax.InputSource;
        
        public class MyResolver implements EntityResolver {
            public InputSource resolveEntity (String publicId, String systemId) {
                if (systemId.equals("http://www.myhost.com/today")) {
                    // return a special input source
                    MyReader reader = new MyReader();
                    return new InputSource(reader);
                } else {
                    // use the default behaviour
                    return null;
                }
            }
        }
        

        使用此代码,您可以提取您的自定义 EntityResolver 并在文档的解析/验证期间使用它。

        final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware = true;
        dbf.setValidating = true;
        final DocumentBuilder db = dbf.newDocumentBuilder();
        final MyResolver r = MyResolver.newInstance();
        db.setEntityResolver(r);
        final Document docFromFile = db.parse("path/to/my/document.xml");
        // or
        final Document docFromStream = db.parse(new FileInputStream("blah"));
        

        【讨论】:

        • 我认为我的第三个 ps: 已经足够清楚了: ps: 我知道我可以提取 SOAP 消息的正文部分,并根据 XSD 对其进行验证。但是,我想根据 WSDL 验证整个 SOAP 消息。
        【解决方案6】:

        由于 SOAP 消息是 xml,您可以针对 xsd 验证整个消息。例如,我为 SOAP 消息找到了 this 模式。你可以:

        1. 从您的 wsdl 中提取架构,
        2. 根据来自 wsdl 和 soap 模式的模式验证消息。

        如果您想针对特定的 WSDL 进行验证,您可以手动准备架构:只需放置消息的根元素而不是这部分:

        <xs:sequence>
        <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
        </xs:sequence>
        

        在 SOAP 架构中。

        【讨论】:

          【解决方案7】:

          针对SOAP envelope schema 进行验证,然后提取正文和标头并针对特定架构进行验证。应该很简单。

          【讨论】:

            【解决方案8】:

            请查看Apache AXIS2 API。

            【讨论】:

            • 你好 hamlin11,我查看了这个 api,但我没有看到任何选项来验证 SOAP 消息是否针对 WSDL。你能给我一个更具体的提示吗?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多