2016-06-23 9 views
1

非マーシャリング中にJAXBによって生成されたJavaでminLength制約が強制されないのはなぜですか?XSDで空のXML要素を防止し、JAXBを使用して検証する方法は?

私は、次の要素

<subHeader seqno="1"><![CDATA[sub header1]]></subHeader> 

を持っていると私はそのようなこの

<subHeader seqno="2" /> 

現在のXSDとして空要素、予防するために私のXSDをしたいと思います:

<xsd:element name="subHeader" type="subHeaderType" minOccurs="0" maxOccurs="unbounded"> 
</xsd:element> 
<xsd:complexType name="subHeaderType"> 
   <xsd:simpleContent> 
      <xsd:extension base="NotEmpty"> 
         <xsd:attribute name="seqno" type="xsd:string" use="required"/> 
      </xsd:extension> 
   </xsd:simpleContent> 
</xsd:complexType> 

<xsd:simpleType name="NotEmpty"> 
   <xsd:restriction base="xsd:string"> 
      <xsd:minLength value="1"></xsd:minLength> 
      <xsd:whiteSpace value="collapse"></xsd:whiteSpace> 
   </xsd:restriction> 
</xsd:simpleType> 

答えて

0

あなたのXSDを許可するでしょう

<subHeader seqno="1"><![CDATA[sub header1]]></subHeader> 

それはない空ですが、それは、あるので

<subHeader seqno="2" /> 

を防ぐため。

したがって、XSDは既にお客様の要件を満たしています。


更新:コメント欄でOPは、クエリがを非整列化中にJAXBで表現されていないxsd:minLength制約について実際にあることを言及しています。

あなたのXSDごとに検証を有効にするには、UnmarshallerSchemaのインスタンスを設定します。ここではそうとValidationEventHandlerを経由して検証イベントを処理する例を示します

package blog.jaxb.validation; 

import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.ValidationEventHandler; 

public class MyValidationEventHandler implements ValidationEventHandler { 

    public boolean handleEvent(ValidationEvent event) { 
     System.out.println("\nEVENT"); 
     System.out.println("SEVERITY: " + event.getSeverity()); 
     System.out.println("MESSAGE: " + event.getMessage()); 
     System.out.println("LINKED EXCEPTION: " + event.getLinkedException()); 
     System.out.println("LOCATOR"); 
     System.out.println(" LINE NUMBER: " + event.getLocator().getLineNumber()); 
     System.out.println(" COLUMN NUMBER: " + event.getLocator().getColumnNumber()); 
     System.out.println(" OFFSET: " + event.getLocator().getOffset()); 
     System.out.println(" OBJECT: " + event.getLocator().getObject()); 
     System.out.println(" NODE: " + event.getLocator().getNode()); 
     System.out.println(" URL: " + event.getLocator().getURL()); 
     return true; 
    } 

} 

コードクレジットBlaise Doughan's blog、優れたJAXBリソースが。

+0

あなたの返信をありがとう、しかし、アンマーシャリングした後も、まだjaxb-xjc beanのseqno = 2属性を見ることができ、unmarshallオブジェクトの後に期待される出力である 'minLength'制約/ getSuHeader()はseqno = 1のデータのみを持ち、seqno = 2ではなく、Plsが私を助けます。 –

+0

ご回答いただきありがとうございます。私はjaxb-xjc beansをxsdからunmarshallに生成していますが、unmarshallを行った後でもまだjaxb-xjc beanのseqno = 2属性が表示されています。 'minLength'制約/制約、unmarshall後の私の予想される出力object.getSuHeader()はseqno = 1のデータのみを持ち、seqno = 2ではなく、Plsが私を助けます。 –

+0

あなたは本当に、あなたの***質問は本質的にJAXB ***についてのことです。回答が更新されました。質問が更新されました。ありがとう。 – kjhughes

関連する問題