Validation 使用CXF 2.3.1的出站消息中未发生JAXB模式验证

Validation 使用CXF 2.3.1的出站消息中未发生JAXB模式验证,validation,jaxb,cxf,xml-validation,Validation,Jaxb,Cxf,Xml Validation,使用CXF 2.3.1 使用JAXB从WSDLs生成Java 使用 <jaxws:properties> <entry key="schema-validation-enabled" value="true" /> </jaxws:properties> 在客户端配置中 我的测试创建了一个不符合WSDL特定要求的对象: <xsd:simpleType name="UUID.Content"> <xsd:annotatio

使用CXF 2.3.1

使用JAXB从WSDLs生成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中的错误:

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

我也遇到过类似的问题(CXF 2.2.7),并且能够通过在我的
bean定义中添加
serviceName
endpointName
属性来解决它。查看此处的“配置Spring客户端(选项1)”部分:了解有关属性的更多信息

注意:我还定义了
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\u JARS
文件中概述的所有CXF提供的库时,我在CXF中遇到了许多意想不到的行为。我还会尝试将它们添加到构建中,以便它们覆盖任何服务器或Java提供的库。如果不需要,您可以稍后删除它们。

现在我想,
wsdlLocaiton
属性可能是客户端查找相关XSD以验证XML所必需的。是的,正如我提到的,它作为注释包含在impl中。系统肯定在查找WSDL。您是否在
serviceClass
属性中指定了接口?如果不这样做,注释将被忽略,因为Spring将加载代理(来自CXF FAQ)。我还记得我也在处理注释,但直到我将
serviceName
endpointName
添加到bean中,验证才起作用。你试过了吗?我必须改变两件事。首先,仅在注释中声明wsdlLocation是不够的。我将其添加到客户机bean的Spring配置中。其次,正如您所建议的,是缺少的serviceName。