我使用 JAX-WS 和 wsimport 生成了一个 Web 服务客户端。
这是我的客户端代码:
URL url = new URL("http://localhost:9999/ws/processstuff?wsdl");
QName qname = new QName("namespace", "ProcessStuffImplService");
Service service = Service.create(url, qname);
ProcessStuffInterface processStuffInterface = service.getPort(ProcessStuffInterface.class);
ProcessStuffObject processStuffObject = new ProcessStuffObject();
//Web service call
processStuffInterface.processStuff(processStuffObject);
在进行上面的 Web 服务调用之前,我需要根据给定的 Schematron 规则验证processStuffObject
。我看过像ph-schematron这样的库,但似乎只能在File
或类似对象上进行验证。有谁知道一种方法来验证用 JAX-WS 生成的对象,比如我的ProcessStuffObject
,根据 Schematron 规则?
更新:
现在我已经ProcessStuffObject
编组到一个可以用 ph-schematron 验证的File
对象,但这似乎是一个非常愚蠢的解决方案。
JAX-WS 通常使用 JAXB 将对象封送到 XML 以便通过网络发送,并将收到的 XML 取消封送到对象中。JAXB API 提供了一些有用的东西,用于透明地处理像 XML 这样的对象,而无需首先显式地将其封送到文件、字符串、字节数组或其他中间表示形式。
你需要的类是JAXBSource。它实现了javax.xml.transform.Source接口,并允许您提供对象和JAXBContext或Marshaller。然后,您可以将其作为采用此类实例的转换或其他方法的源。一些 ph-schematron 方法接受 Source 作为输入,例如这个。
如果将 Schematron 文件预编译为 XSLT,则可以使用 Java XML 转换 API 并将源代码提供给转换器。