簡體   English   中英

marshal / unmarshal基於2種不同模式的2個不同的類

[英]marshal/unmarshal 2 different classes that are based on 2 different schemas

我試圖在spring beans配置文件中配置jaxb2Marshaller,但我對Spring和JAXB很新,所以我可能會采用錯誤的方式。

我想要實現的是同一個bean,它將編組/解組基於2個不同模式的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。

“如果我從配置中注釋掉AccountRequest.xsd值,然后再次運行我的測試,那么第二個類(AccountResponse)的編組/解組它們都會通過,如果我取消注釋它,我會得到錯誤:org.xml.sax。 SAXParseException:cvc-elt.1:找不到元素'accountResponse'的聲明。“

聽起來像SchemaFactory.newSchema()創建的Schema對象只處理列表中的第一個xsd。

如果你有多個模式文件在同一個命名空間(targetNamespace?),那么可能是這個bug造成了麻煩:

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

我解決這個問題的方法是創建包含其他xsd文件的父xsd文件,然后使用LSResourceResolver實現在xml配置中設置“schemaResourceResolver”屬性(請參閱http://blog.frankel.ch/xml-例如,驗證 - 使用importincluded-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配置中,將schemas屬性更改為:

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

嘗試使用MOXy 您可以擁有由注釋定義的模式映射,以及在xml文件中配置的其他映射。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM