Java的。 根据WSDLvalidationSOAP消息

我需要针对WSDLvalidationSOAP消息? (与可以针对XSD架构validationXML文件的方式相同)。

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

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

ps:我知道几个JAX-WS库可以在调用Web服务时validation请求/响应。 但同样,我没有打电话给任何网络服务; 我有一个简单的SOAP消息和一个WSDL ,我需要一个根据WSDLvalidationSOAP消息的函数。

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

ps:我知道我可以提取SOAP消息的正文部分,并根据XSDvalidation它。 但是,我想根据WSDLvalidation整个SOAP消息。

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

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

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

此代码来自Sun / Oracle ,实现了一个基本的EntityResolver 。 您需要构建此类,以便它为DocumentBuilder提供适用于您尝试validation的文档中定义的模式的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自定义EntityResolver并在解析/validation文档期间使用它。

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

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

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

由于SOAP消息是xml,因此您可以针对xsdvalidation整个消息。 例如,我发现了SOAP消息的这个模式。 你可以:

  1. 从wsdl中提取模式,
  2. 从wsdl和soap模式validation针对模式的消息。

如果您想要针对特定​​的WSDL进行validation,您可以手动准备模式:只需放置消息的根元素而不是此部分:

    

在SOAP模式中。

尝试这个

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

     mc.setProperty("USE_TEST_FILE", ); return false; 
  4. public boolean handleResponse(MessageContext mc)

     String testFileName = (String) mc.getProperty("USE_TEST_FILE"); InputStream instream =  SOAPMessageContext smc = (SOAPMessageContext) mc; SOAPMessage message = smc.getMessage(); SOAPPart soapPart = message.getSOAPPart(); soapPart.setContent(new StreamSource(instream)); smc.setMessage(message); return false; 

现在运行你的代理..如果消息对每个WSDL无效,代理将失败

validationSOAP信封架构 ,然后提取正文和标头并针对特定架构进行validation。 应该够简单。

请查看Apache AXIS2 API。