我正在使用Validator API验证Java对象。这可以告诉我该对象根据模式无效,但它给出了一个非常模糊的错误消息,即缺少所有元素属性列表中的一个元素。
架构(为清晰起见而截断):
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://predictivesolutions.com/schema/v1_1" xmlns:snt="http://predictivesolutions.com/schema/v1_1"
elementFormDefault="qualified">
<xs:element name="contactInsert">
<xs:complexType>
<xs:all>
<xs:element name="suffix" type="snt:stringType255"
minOccurs="0" maxOccurs="1" />
<xs:element name="firstName" type="snt:stringType255"
minOccurs="1" maxOccurs="1" />
<xs:element name="lastName" type="snt:stringType255"
minOccurs="1" maxOccurs="1" />
<xs:element name="companyID" type="snt:idType" minOccurs="1"
maxOccurs="1" />
<xs:element name="companyLocationID" type="snt:idType"
minOccurs="1" maxOccurs="1" />
<xs:element name="workPhone" type="snt:phoneType"
minOccurs="0" maxOccurs="1" />
<xs:element name="cellPhone" type="snt:phoneType"
minOccurs="0" maxOccurs="1" />
<xs:element name="homePhone" type="snt:phoneType"
minOccurs="0" maxOccurs="1" />
<xs:element name="otherPhone" type="snt:phoneType"
minOccurs="0" maxOccurs="1" />
我基本上是将JSON对象反序列化为上面架构中的JAXB生成的类。这又有效:
ValidationErrorHandler errorHandler = null;
try {
JAXBContext jc = JAXBContext.newInstance(ContactInsert.class);
JAXBSource source = new JAXBSource(jc, contactInsert);
SchemaFactory sf = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(ContactInsert.class
.getResource("/xsd/v1_1/contact.xsd"));
Validator validator = schema.newValidator();
errorHandler = new ValidationErrorHandler();
validator.setErrorHandler(errorHandler);
validator.validate(source);
我的JSON对象被转换为ContactInsert实例:
{ "companyID":666, "lastName":"dsadasd", "companyLocationID":23950, "otherComments":null }
我希望验证错误是“firstName”是预期的,但是它列出了模式中的每个元素,即使这些元素不是必需的(minOccurs = 0并且在生成的Java类中没有使用@Required注释:< / p>
“cvc-complex-type.2.4.b:元素'contactInsert'的内容不是 完成。之一 “{ “http://predictivesolutions.com/schema/v1_1”:后缀, “http://predictivesolutions.com/schema/v1_1”:名字, “http://predictivesolutions.com/schema/v1_1”:办公电话, “http://predictivesolutions.com/schema/v1_1”:移动电话, “http://predictivesolutions.com/schema/v1_1”:HOMEPHONE, “http://predictivesolutions.com/schema/v1_1”:的OtherPhone, “http://predictivesolutions.com/schema/v1_1”:传真电话, “http://predictivesolutions.com/schema/v1_1”:电子邮件, “http://predictivesolutions.com/schema/v1_1”:isDesignate, “http://predictivesolutions.com/schema/v1_1”:isActive, “http://predictivesolutions.com/schema/v1_1”:mainSponsorID, “http://predictivesolutions.com/schema/v1_1”:hidePercentSafeFlag, “http://predictivesolutions.com/schema/v1_1”:externalContactID, “http://predictivesolutions.com/schema/v1_1”:useAsARef, “http://predictivesolutions.com/schema/v1_1”:POSITIONTITLE, “http://predictivesolutions.com/schema/v1_1”:otherComments, “http://predictivesolutions.com/schema/v1_1”:formerCompanyID, “http://predictivesolutions.com/schema/v1_1”:industryStartDate, “http://predictivesolutions.com/schema/v1_1”:employmentStartDate}'是 预期“。
是否可以将验证程序配置为仅报告必填字段(“firstName”)。我对JAXB比较陌生,但似乎错误信息不准确,并且JAXB只是简单地说出其中一个元素缺失,但我不会告诉你哪个。
答案 0 :(得分:0)
返回的错误消息来自javax.xml.validation.Validator
而不是JAXB。在这个用例中,JAXB只是XML源代码。如果您交换了StAXSource
,StAX解析器将不会负责架构验证。
好的......但为什么验证器会在错误中报告所有这些字段 消息?
以下是您遇到的错误:
“cvc-complex-type.2.4.b:元素'contactInsert'的内容不是 完成。之一 “{ “http://predictivesolutions.com/schema/v1_1”:后缀, “http://predictivesolutions.com/schema/v1_1”:名字, “http://predictivesolutions.com/schema/v1_1”:办公电话, “http://predictivesolutions.com/schema/v1_1”:移动电话, “http://predictivesolutions.com/schema/v1_1”:HOMEPHONE, “http://predictivesolutions.com/schema/v1_1”:的OtherPhone, “http://predictivesolutions.com/schema/v1_1”:传真电话, “http://predictivesolutions.com/schema/v1_1”:电子邮件, “http://predictivesolutions.com/schema/v1_1”:isDesignate, “http://predictivesolutions.com/schema/v1_1”:isActive, “http://predictivesolutions.com/schema/v1_1”:mainSponsorID, “http://predictivesolutions.com/schema/v1_1”:hidePercentSafeFlag, “http://predictivesolutions.com/schema/v1_1”:externalContactID, “http://predictivesolutions.com/schema/v1_1”:useAsARef, “http://predictivesolutions.com/schema/v1_1”:POSITIONTITLE, “http://predictivesolutions.com/schema/v1_1”:otherComments, “http://predictivesolutions.com/schema/v1_1”:formerCompanyID, “http://predictivesolutions.com/schema/v1_1”:industryStartDate, “http://predictivesolutions.com/schema/v1_1”:employmentStartDate}'是 预期“。
此实现已选择列出此处可能出现的所有可能元素。如果只列出某人所需的元素可能会打开一个与此类似的问题,以及为什么省略了可选元素。