Java的。根据WSDL验证SOAP消息

时间:2011-09-02 09:49:16

标签: java web-services

我需要针对WSDL验证SOAP消息吗? (与XML模式可以验证XSD文件的方式相同。

我没有打电话给任何网络服务; 我只有一条SOAP消息和一个WSDL,我需要验证SOAP消息是否正确。 没有调用网络服务或之后的任何内容。

我需要在Java程序中进行此验证。 你知道一个小的Java库吗?

ps:我知道几个JAX-WS库可以在您调用Web服务时验证请求/响应。但同样,我没有打电话给任何网络服务;我有一条简单的SOAP消息和一个WSDL,我需要一个功能来验证针对SOAP的{​​{1}}消息。

ps:我也知道有可以执行此操作的工具,例如WSDLSOAPUI。同样,我需要在我的Java程序中进行此验证。

ps:我知道我可以提取XMLSpy消息的正文部分,并根据SOAP对其进行验证。不过,我想针对XSD验证整个SOAP邮件。

8 个答案:

答案 0 :(得分:6)

答案 1 :(得分:1)

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

另一种方法可能是使用像SOAPUI这样的工具。您可以尝试使用基于您拥有的WSDL的SOAP UI设置模拟Web服务,然后通过调用模拟服务来调用测试您的Web服务客户端。请参阅此处的{00}}

中的SOAP UI链接

答案 2 :(得分:0)

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

此代码来自Sun/Oracle,实现了基本的EntityResolver。您需要构建此类,以便它为DocumentBuilder提供适用于您尝试验证的文档中定义的架构的InputSource

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"));

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

试试这个

  1. 使用WSDL并创建Jax-RPC代理
  2. 创建一个Web服务JAX RPC处理程序并将其注册到webservice引用 请参阅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;
    
  5. 现在运行你的代理..如果消息对于每个WSDL无效,代理将失败

答案 5 :(得分:0)

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

  1. 从wsdl中提取架构,
  2. 根据wsdl和soap模式验证模式消息。
  3. 如果您想要针对特定​​的WSDL进行验证,您可以手动准备架构:只需放置消息的根元素而不是此部分:

    <xs:sequence>
    <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
    </xs:sequence>
    
    在SOAP模式中

答案 6 :(得分:0)

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

答案 7 :(得分:-3)

请查看Apache AXIS2 API。