[英]Java. Validate SOAP message against a WSDL
我需要针对WSDL
验证SOAP消息吗? (与可以针对XSD
架构验证XML
文件的方式相同)。
我没有打电话给任何网络服务; 我只有一个SOAP
消息和一个WSDL
,我需要验证SOAP
消息是否正确。 无需调用网络服务或之后的任何内容。
我需要在Java程序中进行此验证。 你知道一个小的Java库吗?
ps:我知道几个JAX-WS
库可以在您调用Web服务时验证请求/响应。 但同样,我没有打电话给任何网络服务; 我有一个简单的SOAP
消息和一个WSDL
,我需要一个根据WSDL
验证SOAP
消息的函数。
ps:我也知道有些工具可以做到这一点,比如SOAPUI
和XMLSpy
。 同样,我需要在我的Java程序中进行此验证。
ps:我知道我可以提取SOAP
消息的正文部分,并根据XSD
对其进行验证。 但是,我想根据WSDL
验证整个SOAP
消息。
您可以在开源soapUI项目中查看WsdlValidator类的源代码。
https://github.com/SmartBear/soapui
http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/support/wsdl/WsdlValidator.html
如果您使用基于Apache CXF或Apache Axis 2的代码生成器创建Web服务客户端,只要Web服务提供者和您的客户端都在相同版本的SOAP / WS中,您的Web服务代码就可以正常运行*标准。基于您选择调用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
试试这个
在处理程序中,尝试使用public boolean handleRequest(MessageContext mc)
的以下代码添加这些行
mc.setProperty("USE_TEST_FILE", <your response in .xml file>); return false;
在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无效,代理将失败
您可以使用您拥有的WSDL创建存根,然后使用XML请求对存根进行查询。 如果这一点正确,您的请求是正确的。
您可以在项目中导入WSDL,然后使用XML调用存根服务。 这样,您可以在不更改代码的情况下更改验证。
由于SOAP消息是xml,因此您可以针对xsd验证整个消息。 例如,我发现了SOAP消息的这个模式。 你可以:
如果要对特定的WSDL进行验证,可以手动为模式做好准备:只需放置消息的根元素而不是此部分:
<xs:sequence>
<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
在SOAP模式中。
验证SOAP信封架构 ,然后提取正文和标头,并针对特定架构进行验证。 应该够简单。
我认为你可能正在寻找一个对你真正需要的东西过于复杂的答案。 您真正需要做的就是注册相应的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
自定义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"));
请查看Apache AXIS2 API。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.