2013-10-03 25 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