2015-07-13 59 views
0

我傳遞一些XML的RESTful Web服務:規定在JAXB中只允許一個元素的一個實例?

<root> 
    <element1/> 
     <element2/> 
    <element3/> 
</root> 

Web服務將解組此XML,我希望確保XML是有效的。

我使用的架構來創建Java對象,並在此架構element1具有maxOccurs=1屬性但這對所創建的(不同於,例如Java對象沒有影響,添加minOccurs=1這將導致"required=true"被添加到@XMLElement註釋)。在解組傳遞Web服務的XML時,如果一次只出現一次的元素出現多次,那麼元素的最後一個實例將被解析。我不希望發生這種情況,因爲我希望能夠提醒客戶他們發送的XML無效,並且應該刪除任何不適用的元素 - 而不是隻是隨意接受最後一個元素。我相信這將涉及解組之前的一些預驗證 - 我可以使用beforeUnmarshal方法。

經過一番研究,我的理解是沒有JAXB註釋可以讓我指定element1只能存在一次。是這樣嗎?如果沒有模式,是否可以驗證它?

+0

你試過maxOccurs = 1嗎? – Victor

+0

我從maxOccurs = 1的模式生成了我的java類,是的。但是java類沒有任何東西可以強制執行,所以如果有多個元素會解析最後一個元素,並且似乎忽略了其餘元素,那麼當我真的需要一個異常時。 – kirsty

+0

JAXB不執行模式驗證。你必須手動進行模式驗證 –

回答

1

我已經通過允許元素的多個實例的Java對象解決此問題的工作:

@XmlElement(name = "element1", required = true) 
private List<element1> element1; 

這將讓我檢查我的列表的大小在afterUnmarshal方法,如果大小該列表大於1,我可以拋出一個新的ValidationException

0

哪個應用程序調用您的應用程序,因爲它是位很難做到在JAVA層,但你可以很容易做到,在您的Web服務層,在那裏你可以定義你的minOccurance 1個廣告,這將有助於。

但是,如果你想這樣做基於Java層,你需要使用XML解析器再算上特定標籤的次數,但還需要大量的時間。

+0

嗨@Kulbhushan,我編輯了我的問題以增加更多清晰度,因爲我相信我的最初問題可能有點誤導! – kirsty

+0

所以,基本上你需要限制用戶只傳遞一次特定的標籤。你已經使用了maxOccurs = 1,但是它只能指定用戶可以傳遞的最大計數,如果用戶沒有通過,他將從web服務中獲取錯誤輸入xml的錯誤,你不需要付出額外的努力。如果你想讓它強制使用minOccurs = 1。 –

+0

標籤需要零次或一次。用兩個相同的標籤解組XML,不會拋出任何異常,只有最後一個元素被解組。我希望能夠在解組發生之前提醒客戶端已發送到Web服務的XML無效,以便他們可以確保正確的元素被解組(而不是在最後一個'猜測')。我希望能夠在不根據模式進行驗證的情況下執行此操作。你是否說沒有模式沒有辦法做到這一點? – kirsty

相關問題