1

使用 CXF 2.3.1。

使用 JAXB 从 WSDL 生成 Java。

使用

<jaxws:properties>
    <entry key="schema-validation-enabled" value="true" />
</jaxws:properties>

在客户端配置中。

我的测试创建了一个不符合 WSDL 特定要求的对象:

<xsd:simpleType name="UUID.Content">
    <xsd:annotation>
        <xsd:documentation xml:lang="EN">
            Universally Unique Identifier
            </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:token">
        <xsd:length value="36" />
        <xsd:pattern
            value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
    </xsd:restriction>
</xsd:simpleType>

但是,消息被编组并通过传出拦截器链一直传递。

WSDL 是单向的:仅输入。

wsdlLocation 在 Impls 的注释中指定。

有趣的是,未通过相同约束验证的传入消息在解组期间被拦截器链阻止。

我正在测试 WebLogic。我还可以在需要 WebSphere 上进行测试。

传出编组器正在捕获其他 XSD 验证失败(例如缺少必需元素)。

我们从 2.2.6 升级到 CXF 2.3.1 的原因是我们在入站消息中看到了类似的问题。在 2.3.1 中,对入站消息进行完整的 XSD 验证,但对出站消息不进行。

这是CXF中的错误:

https://issues.apache.org/jira/browse/CXF-3233

我们通过使用 org.springframework.xml.validation.XmlValidator 在将消息发送到 CXF 拦截器链之前进行验证来解决这个问题。我希望修复使用 CXF 拦截器链。但是,我怀疑这是 CXF 中的错误。

4

1 回答 1

0

我遇到过类似的问题(CXF 2.2.7),并且能够通过将serviceNameandendpointName属性添加到我的<jaxws:client>bean 定义来解决它。在此处查看“配置 Spring 客户端(选项 1)”部分:https ://cwiki.apache.org/CXF20DOC/jax-ws-configuration.html以获取有关属性的更多信息。

注意:我也wsdlLocation定义了属性。这可能是 CXF 查找服务使用的 XSD 所必需的。

这是我所拥有的一个例子:

<jaxws:client id="client"
              serviceClass="com.example.ServiceInterface"
              address="http://example.com/endpoint"
              wsdlLocation="WEB-INF/wsdl/SampleWSDLFile.wsdl"
              serviceName="s:SampleService"
              endpointName="s:SampleServicePort"
              xmlns:s="http://www.example.com/some/namesapce">
...
</jaxws:client>

org.apache.cxf.wsdl.EndpointReferenceUtils我还注意到,当我遇到这个问题时,每次调用客户端时,类都会将整个模式打印到我的日志文件中。当我像上面那样设置我的客户端 bean 时,这种行为就消失了。我想知道你是否也看到了类似的东西......

我应该提到的另一个细节是,当我没有使用WHICH_JARS文件中列出的所有 CXF 提供的库时,我遇到了很多来自 CXF 的意外行为。我也会尝试将它们添加到构建中,以便它们覆盖任何服务器或 Java 提供的库。如果不需要,您可以随时将其删除。

于 2011-01-07T23:35:49.893 回答