JAXB验证返回非必填字段

时间:2014-03-07 20:34:08

标签: json jaxb xsd

我正在使用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只是简单地说出其中一个元素缺失,但我不会告诉你哪个。

1 个答案:

答案 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}'是   预期“。

此实现已选择列出此处可能出现的所有可能元素。如果只列出某人所需的元素可能会打开一个与此类似的问题,以及为什么省略了可选元素。