为什么在解组时JAXB生成的Java中没有强制执行minLength
约束?
我有以下元素
<subHeader seqno="1"><![CDATA[sub header1]]></subHeader>
我希望我的XSD能够阻止空元素,比如这个
<subHeader seqno="2" />
当前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 :(得分:0)
您的XSD将允许
<subHeader seqno="1"><![CDATA[sub header1]]></subHeader>
因为 不为空 ,但阻止了
<subHeader seqno="2" />
因为 为空 。
因此,您的XSD已经满足您的要求。
更新:评论中的OP提到该查询实际上是关于在解组期间未在JAXB中表示的 xsd:minLength
约束。
要为您的XSD启用验证,请在Schema
上设置Unmarshaller
的实例。以下是通过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资源。