2017-05-17 5 views
0

私のスキーマのxsd:unique制約は、いくつかの要素の主キーと外部キーを定義します。xsd:Javaクラス内でユニーク

スキーマはエラーをスローしませんが、

Javaクラスxsd:uniqueを生成中は追加されません。

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xsd:import namespace="urn:schemas-microsoft-com:xml-msdata" schemaLocation="msdata.xsd" /> 
    <xsd:element name="root"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element maxOccurs="unbounded" name="subroot"> 
      <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element minOccurs="0" name="set"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:any processContents="lax" /> 
        <xsd:choice> 
         <xsd:sequence> 
         <xsd:element maxOccurs="unbounded" name="Held"> 
          <xsd:complexType> 
          <xsd:attribute name="_attr1" use="required" type="xsd:integer" /> 
          <xsd:attribute name="_attr2" use="required" type="xsd:integer" /> 
          </xsd:complexType> 
         </xsd:element> 
         <xsd:element maxOccurs="unbounded" name="Asses"> 
          <xsd:complexType> 
          <xsd:attribute name="_attr2" use="required" type="xsd:integer" /> 
          <xsd:attribute name="_attr3" use="required" type="xsd:NCName" /> 
          </xsd:complexType> 
         </xsd:element> 
         </xsd:sequence> 
        </xsd:choice> 
        </xsd:sequence> 
       </xsd:complexType> 
       <xsd:unique name="PK_Held" msdata:PrimaryKey="true"> 
        <xsd:selector xpath="xsd:Held"></xsd:selector> 
        <xsd:field xpath="@_attr1"></xsd:field> 
       </xsd:unique> 
       <xsd:unique name="PK_Asses" msdata:PrimaryKey="true"> 
       <xsd:selector xpath="xsd:Asses"></xsd:selector> 
       <xsd:field xpath="@_attr2"></xsd:field> 
       </xsd:unique> 
       <xsd:keyref name="FK_Held_Asses" refer="PK_Asses"> 
       <xsd:selector xpath="xsd:Held"></xsd:selector> 
       <xsd:field xpath="@_attr2"></xsd:field> 
       </xsd:keyref> 
       </xsd:element> 
      </xsd:sequence> 
       </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+1

JAXBは検証ルールを強制しません。検証規則を適用するには、検証を有効にしてXMLを解析するときにXSDスキーマを指定する必要があります。 – Andreas

+0

@アンドレアス私は、コメントではなく答えとしての資格があると思います。おそらく、Schemaインスタンスを作成してアンマーシャラーに設定する方法について少しスニペットで投稿してください。 –

+0

ありがとうございましたAndreas、もう一つの追加情報---これはxmlを提供しているベンダーです。私たちはそこからスキーマを生成しました。彼らはxml自体にユニークな制約を送信しているので、解析は ''タグで失敗します。 – thiagu

答えて

1

JAXBは検証ルールを強制しません。

検証ルールを適用するには、のXMLをに解析するときに、XSDスキーマを指定する必要があります。

UnmarshallerにあなたのためにXMLを解析するとします。あなたはDOMノードを非整列化していない、あなたはこのようにそれを実行します。

検証と整形式

クライアント:これはUnmarshallerのjavadocの記述されている

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(schemaFile); // file or URL 

JAXBContext jaxbContext = JAXBContext.newInstance(); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
unmarshaller.setSchema(schema); 
unmarshaller.setEventHandler(handler); // To specify how validation errors should be handled 
Object obj = unmarshaller.unmarshal(source); 

アプリケーションでは、setSchema(javax.xml.validation.Schema) APIを使用してJAXP 1.3検証メカニズムを有効または無効にすることができます。洗練されたクライアントは、独自の検証SAX 2.0準拠パーサーを指定し、unmarshal(Source) APIを使用してJAXP 1.3検証メカニズムをバイパスできます。

無効なXMLコンテンツのアンマーシャリングがJAXB 2.0で定義されているため、Unmarshallerのデフォルト検証イベントハンドラはJAXB 1.0よりも緩やかになりました。 JAXB 1.0バインディングコンパイラで生成されたスキーマ派生コードがJAXBContextに登録されている場合、デフォルトのアンマーシャル検証ハンドラはDefaultValidationEventHandlerであり、致命的なエラーまたはエラーが発生した後にマーシャリング操作を終了します。 JAXB 2.0クライアント・アプリケーションの場合、明示的に定義されたデフォルトの検証ハンドラはなく、デフォルトのイベント処理では、致命的なエラーが発生した後にアンマーシャル操作を終了するだけです。

+0

投稿Andreasありがとう。 – thiagu

関連する問題