2013-10-03 27 views
1

我实现了利用CXF(2.7.1)与WSDL & XSD,其中包括,除其他事项外,下列类型的工作Web服务:为什么这个XSD元素通过默认的ValidationEventHandler?

<xs:simpleType name="SimpleIdType"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="[A-Za-z0-9:\.\-]{20}"/> 
    </xs:restriction> 
</xs:simpleType> 

我解释这是:只接受20字符串其中只包含字母数字字符和':','。'和' - '

当我发送一个SOAP消息到我的web服务并且相应的元素包含FAAAAAAAAAAAAAAAAAAA时,服务当然可以正确接受,没有任何错误。

然而,如果我发送相同的SOAP消息与#代替F(即#AAAAAAAAAAAAAAAAAAA),服务仍然接受消息,而不会发出任何验证错误(解组或其他方式)。

为什么?

是不是default ValidationEventHandler应该通过抛出“Unmarshalling Error”来处理?

回答

0

我终于找到了这个基于CXF-情况下,正确的答案。

CXF已经具有内置的运行时模式验证。它被命名为schema validation via configuration,那是在我的代码唯一缺少的是XML来启用它,已经存在的<jaxws:endpoint元素里面beans.xml AKA application-context.xml

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

这一发现是由@Patrick应归功于答案。

1

JAXB模型(生成的或手工编码的)在其注释中不包含来自XML模式的所有元数据。如果您想验证模式的所有方面,您可以启用该功能,在Unmarshaller上指定Schema的实例。

+0

哇。 +1已经。我会彻底阅读你的文章,并让你知道,如果这对我有用。我是否理解正确,这意味着也设置我自己的[ValidationEventHandler](https://jaxb.java.net/jaxb20-ed/api/javax/xml/bind/ValidationEventHandler.html)? – Withheld

+0

好的,我试着实现你的解决方案,但是我在[我的CXF生成的代码](http://stackoverflow.com/q/19184721/1864054)中没有'main()'。 [哪里](http://stackoverflow.com/q/19184721/1864054)钩我的纲领和Unmarshaller代码? – Withheld

+0

看起来我正在接近这个错误的方式(因为涉及到CXF):根据[this](http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/wsdl_first_xmlbeans /),类路径(及其内容)上的cxf.xml配置文件的存在会更改CXF的默认行为,即消息参数不会被验证。这是令人困惑的,因为如果我发送“?”,我肯定会得到“解组错误”(默认为!)而不是'xs:timestamp' ...我错过了什么? – Withheld