2012-05-30 32 views
3

我試圖在spring beans配置文件中配置jaxb2Marshaller,但是Im對Spring和JAXB來說很新,所以我可能會以錯誤的方式去解決它。marshal/unmarshal基於2個不同模式的2個不同的類

我想要實現的是相同的bean,它將基於2個不同的模式對兩個不同的類進行編組/解組。也許這是不可能的,因爲當我配置並運行我的測試時,他們在配置中的第二類失敗(AccountResponse)。

這是XML配置:

<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="marshallerProperties"> 
     <map> 
      <entry key="com.sun.xml.bind.namespacePrefixMapper"> 
       <bean id="NamespacePrefixMapperImpl" class="org.lp.soa.controller.xml.LpsNamespacePrefixMapper" /> 
      </entry> 
     </map> 
    </property> 
    <property name="classesToBeBound"> 
     <list>        
      <value>org.lp.soa.controller.data.request.AccountRequest</value> 
      <value>org.lp.soa.controller.data.response.AccountResponse</value> 
     </list> 
    </property>  
    <property name="schemas"> 
     <list> 
     <value>classpath:schema/AccountRequest.xsd</value> 
     <value>classpath:schema/AccountResponse.xsd</value> 
     </list> 
    </property> 
</bean> 

如果我註釋掉AccountRequest.xsd從配置值,然後再次運行我的測試元帥/解組第二類(AccountResponse)他們都傳遞,如果我然後取消註釋它我得到的錯誤:org.xml.sax.SAXParseException:cvc-elt.1:無法找到元素'accountResponse'的聲明。

我是不是正在做錯事情?是不是應該可以用兩個模式處理兩個類?

謝謝, Yoav。

+1

你需要JAXB?不要使用它。使用像XStream這樣的不需要配置的東西,並且會自動編組/解組業務對象。爲什麼要花費*任何時間來做這件事時,你可以專注於你的應用程序? – ianpojman

+0

謝謝! XStream看起來很有趣,不好試試。 – poeticGeek

+0

我確實想要驗證與定義的模式生成的xml,XStream可以做到這一點嗎? – poeticGeek

回答

1

嘗試使用MOXy。您可以通過註釋定義模式映射,並將其他映射配置爲xml文件。

據我所知,XStream不提供xml驗證,因此您可以在unmarshal之前嘗試進行模式驗證。 使用JAXB,您可以使用@XmlElement/@XmlAttribute(required=true)註釋驗證所需的元素/屬性。

+0

+1 - 以下是一個示例:http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple-xml-schemas .html –

+0

感謝球員,但不知道這些究竟是如何適用於我在做什麼。我春天做了所有的Jaxb2Marshaller實例的連線,並試圖將兩個不同的POJO映射到兩個不同的模式(每個模式一個)。我希望同一個實例能夠編組/解組兩個object/xml。 Moxy仍然相關嗎? (即時通訊使用NetBeans btw,不知道是否重要)... – poeticGeek

+0

spring的oxm支持不同類型的marshallers ...使用比JAXB更容易/更好的..看看我上面的評論。 – ianpojman

4

" if i comment out the AccountRequest.xsd value from the config and then run my tests again the marshal/unmarshal for the second class (AccountResponse) they all pass, if I then uncomment it I get the error: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'accountResponse'. "

聽起來像()由SchemaFactory.newSchema正在創建架構對象僅處理所述列表中的第一XSD。

如果您有在同一個命名空間的多個模式文件(目標名稱?),那麼這可能是這個錯誤,是造成麻煩:

https://issues.apache.org/jira/browse/XERCESJ-1130

我做了什麼來解決這個bug是創造,其中包括其他XSD文件,然後父XSD文件中設置與實施LSResourceResolver的XML配置的「schemaResourceResolver」屬性(見http://blog.frankel.ch/xml-validation-with-importedincluded-schemas例如)..

在XML配置補充一點:

parent.xsd文件看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.yourdomain.com/FIXED/EXAMPLE" 
      targetNamespace="http://www.yourdomain.com/FIXED/EXAMPLE" 
      elementFormDefault="qualified" 
      version="1.000" 
      id="some_id"> 
    <xs:include schemaLocation="AccountRequest.xsd"/> 
    <xs:include schemaLocation="AccountResponse.xsd"/> 
</xs:schema> 

在XML配置的模式屬性更改爲:

<property name="schemas"> 
     <list> 
     <value>classpath:schema/parent.xsd</value> 
     </list> 
</property> 
+0

謝謝,這種技術對我很有用。 – Espresso

相關問題