3

Spring Beans構成ファイルでjaxb2Marshallerを構成しようとしていますが、SpringとJAXBはかなり新しいので、間違った方法で実行している可能性があります。

私が達成したいのは、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値をコメントアウトしてから、2番目のクラス(AccountResponse)のマーシャル/アンマーシャルを再度実行すると、すべて合格します。コメントを外すと、エラーが発生します:org.xml.sax.SAXParseException :cvc-elt.1:要素'accountResponse'の宣​​言が見つかりません。

私はそれについて間違った方法で行っていますか?2つのスキーマで2つのクラスを処理することはできないはずですか?

ありがとう、Yoav。

4

2 に答える 2

5

「構成から AccountRequest.xsd 値をコメントアウトしてから、テストを再度実行すると、2 番目のクラス (AccountResponse) のマーシャル/アンマーシャルがすべてパスしますが、コメントを外すと、org.xml.sax というエラーが発生します。 SAXParseException: cvc-elt.1: 要素 'accountResponse' の宣言が見つかりません。"

SchemaFactory.newSchema() によって作成される Schema オブジェクトは、リスト内の最初の xsd のみを処理しているようです。

同じ名前空間 (targetNamespace?) に複数のスキーマ ファイルがある場合、問題を引き起こしているのは次のバグである可能性があります。

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

このバグを回避するために私がしたことは、他の 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>
于 2013-07-29T07:40:56.993 に答える
1

MOXyを使用してみてください。注釈によって定義されたスキーマ マッピングと、xml ファイルで構成された他のマッピングを持つことができます。

私の知る限り、XStream は xml 検証を提供していないため、非整列化の前にスキーマ検証を行うことができます。@XmlElement/@XmlAttribute(required=true)JAXB を使用すると、アノテーションを使用して必要な要素/属性を検証できます。

于 2012-05-30T21:47:04.300 に答える