我想使用 xsd 验证我的 JAXB 对象并希望返回正确的错误消息。但我能得到的错误信息是:
cvc-complex-type.2.4.a:发现以元素“applicant-dto”开头的无效内容。应为“{applicant-id}”之一。
[cvc-pattern-valid: 值 '12345670' 对于类型 'ssn' 的模式 '^\d{3}-\d{2}-\d{4}$' 不是 facet-valid。,cvc- type.3.1.3:元素“ssn”的值“12345670”无效。]
我想得到正确的错误信息。任何人都可以帮我弄清楚。
我的xsd是
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="applicant" type="applicantDTO" />
<xs:complexType name="applicantDTO" >
<xs:sequence>
<xs:element name="applicant-id" type="xs:long" minOccurs="1" />
<xs:element name="first-name" type="name" minOccurs="0" />
<xs:element name="middle-name" type="xs:string" minOccurs="0" />
<xs:element name="last-name" type="name" minOccurs="0" />
<xs:element name="ssn" type="ssn" minOccurs="1" />
<xs:element name="date-of-birth" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="name">
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z ]{3,30}"></xs:pattern>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ssn">
<xs:restriction base="xs:string">
<xs:pattern value="^\\d{3}-\\d{2}-\\d{4}$"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:schema>
我的 JAXB 对象是
申请人DTO
为了使用 XSD 验证它,我正在编写下面的代码
@Test
public void testValidateApplicantDTO() throws Exception {
ApplicantDTO eDTO = getApplicantDTO();
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("src/test/resources/applicant.xsd"));
Validator validator = schema.newValidator();
CustomErrorHandler errorHandler = new CustomErrorHandler();
validator.setErrorHandler(errorHandler);
JAXBContext jc = JAXBContext.newInstance(ApplicantDTO.class);
JAXBSource source = new JAXBSource(jc, eDTO);
validator.validate(source);
System.out.println(errorHandler.getErrors());
}
我已经写了我的自定义错误处理程序
自定义错误处理程序
public class CustomErrorHandler extends DefaultHandler {
List<String> errors = new ArrayList<String>();
@Override
public void warning(SAXParseException exception) throws SAXException {
System.out.println("CustomErrorHandler.warning()");
}
@Override
public void error(SAXParseException exception) throws SAXException {
System.out.println("CustomErrorHandler.error()");
errors.add(exception.getLocalizedMessage());
}
@Override
public void fatalError(SAXParseException exception) throws SAXException {
System.out.println("CustomErrorHandler.fatalError()");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
System.out.println("CustomErrorHandler.startElement()");
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("CustomErrorHandler.endElement()");
}
/**
* @return the errors
*/
public List<String> getErrors() {
return this.errors;
}
/**
* @param errors the errors to set
*/
public void setErrors(List<String> errors) {
this.errors = errors;
}
}
错误列表返回给我并显示错误消息: