Validation JAXB解组验证抛出cvc elt.1:找不到元素错误的声明

Validation JAXB解组验证抛出cvc elt.1:找不到元素错误的声明,validation,jaxb,unmarshalling,Validation,Jaxb,Unmarshalling,我对JAXB和验证有点陌生,已经花了几个小时试图解决这个问题,但没有结果。我创建了一个简单的JAXB解组器示例来解析XML文件。我也创建了一个适当的XSD文件,但是验证器一直抱怨它找不到元素的声明 我认为这可能与名称空间问题有关,但我已经尝试了所有我能想到的方法,但似乎仍然无法解决错误。据我所知,我的XSD和XML是正确的,因此这可能与我实例化解组器的方式有关,但我似乎在任何地方都找不到问题 我一直收到的错误/异常是: Caused by: org.xml.sax.SAXParseExcepti

我对JAXB和验证有点陌生,已经花了几个小时试图解决这个问题,但没有结果。我创建了一个简单的JAXB解组器示例来解析XML文件。我也创建了一个适当的XSD文件,但是验证器一直抱怨它找不到元素的声明

我认为这可能与名称空间问题有关,但我已经尝试了所有我能想到的方法,但似乎仍然无法解决错误。据我所知,我的XSD和XML是正确的,因此这可能与我实例化解组器的方式有关,但我似乎在任何地方都找不到问题

我一直收到的错误/异常是:

Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'calculateBorrowingDataResponse'.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
    at org.apache.xerces.jaxp.validation.ValidatorHandlerImpl.startElement(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:85)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:47)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:113)
    at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:236)
    at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:119)
    at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:102)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:299)
    ... 2 more
以下是导致错误的源文件

Java代码:

// We need a Document
InputStream is = UnmarshalTest.class.getClassLoader().getResourceAsStream("calculateBorrowingDataResponse.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Node node = db.parse(is);

// Creating an unmarshaller
Unmarshaller u = JAXBContext.newInstance(CalculateBorrowingDataResponseType.class).createUnmarshaller();

// Setting the Validation
Schema schema;
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schema = schemaFactory.newSchema(new File("src/main/webapp/WEB-INF/wsdl/CalculateBorrowingDataResponse.xsd"));
u.setSchema(schema);
u.unmarshal(node, CalculateBorrowingDataResponseType.class);
CalculateBrowingDataResponse.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema 
    version="1.1"
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified"
    targetNamespace="http://www.domain.com/ClientServices/LendingSimulation/CalculateBorrowingDataResponse" 
    xmlns:lssSt="http://www.domain.com/ClientServices/LendingSimulation/CalculateBorrowingDataResponse"
    xmlns:cbdRes="http://www.domain.com/ClientServices/LendingSimulation/CalculateBorrowingDataResponse" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">


    <!-- CalculateBorrowingData -->
    <xsd:complexType name="CalculateBorrowingDataResponseType">
        <xsd:sequence>
            <xsd:element name="loanAgmt" type="cbdRes:LoanAgreementType" minOccurs="1" maxOccurs="1" />
        </xsd:sequence>
    </xsd:complexType>


    <xsd:complexType name="LoanAgreementType">
        <xsd:sequence>
            <xsd:element name="borrowingBasedPmtAmt" type="lssSt:borrowingBasedPmtAmt" minOccurs="0" maxOccurs="1" />
            <xsd:element name="maxPmtAmt" type="lssSt:maxPmtAmt" minOccurs="0" maxOccurs="1" />
            <xsd:element name="borrowingCapacityMin" type="lssSt:borrowingCapacityMin" minOccurs="0" maxOccurs="1" />
            <xsd:element name="borrowingCapacityMax" type="lssSt:borrowingCapacityMax" minOccurs="0" maxOccurs="1" />
            <xsd:element name="propertyValueMinAmt" type="lssSt:propertyValueMinAmt" minOccurs="0" maxOccurs="1" />
            <xsd:element name="propertyValueMaxAmt" type="lssSt:propertyValueMaxAmt" minOccurs="0" maxOccurs="1" />
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="calculateBorrowingDataResponse" type="cbdRes:CalculateBorrowingDataResponseType"/>


    <xsd:simpleType name="borrowingBasedPmtAmt">
        <xsd:restriction base="xsd:decimal" >
        <xsd:totalDigits value="19" />
        <xsd:fractionDigits value="4" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="maxPmtAmt">
        <xsd:restriction base="xsd:decimal" >
        <xsd:totalDigits value="19" />
        <xsd:fractionDigits value="4" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="borrowingCapacityMin">
        <xsd:restriction base="xsd:decimal" >
        <xsd:totalDigits value="19" />
        <xsd:fractionDigits value="4" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="borrowingCapacityMax">
        <xsd:restriction base="xsd:decimal" >
        <xsd:totalDigits value="19" />
        <xsd:fractionDigits value="4" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="propertyValueMinAmt">
        <xsd:restriction base="xsd:decimal" >
        <xsd:totalDigits value="19" />
        <xsd:fractionDigits value="4" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="propertyValueMaxAmt">
        <xsd:restriction base="xsd:decimal" >
        <xsd:totalDigits value="19" />
        <xsd:fractionDigits value="4" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

CalculateBrorwingDataResponse.xml

<?xml version="1.0" encoding="UTF-8"?>
<calculateBorrowingDataResponse
    xmlns="http://www.domain.com/ClientServices/LendingSimulation/CalculateBorrowingDataResponse"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ns2="http://www.domain.com/ClientServices/LendingSimulation/V1.1">
    <loanAgmt>
        <borrowingBasedPmtAmt>1231231</borrowingBasedPmtAmt>
        <maxPmtAmt>987654321</maxPmtAmt>
        <borrowingCapacityMax>99999</borrowingCapacityMax>
    </loanAgmt>
</calculateBorrowingDataResponse>

1231231
987654321
99999
我尝试使用和不使用XSD中的最后一个元素定义(即:XSD:element name=“CalculateBrorwingDataResponse”…),但都不起作用

我对各种各样的东西都没有想法去尝试了。如有任何建议或建议,将不胜感激

这是我试图找到问题根源的第四个小时了。经过了很多努力,现在,我相信您已经错过了一行代码,能够上升到辉煌的高度

问题是默认情况下通过
DocumentBuilderFactory.newInstance()
创建的
DocumentBuilderFactory
不支持名称空间

您可以通过两种方式克服此问题:

  • 使您的
    DocumentBuilderFactory
    命名空间感知:

  • 或者在解组时使用
    StreamSource
    ,将
    DocumentBuilder
    和他的小朋友一起放下:

  • 如果是第二种选择,你应该这样做

    InputStream xsdStream = ...
    InputStream xmlStream = ...
    
    SchemaFactory f = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema s = schemaFactory.newSchema(xsdStream);
    
    JAXBContext c = JAXBContext.newInstance(CalculateBorrowingDataResponseType.class);
    Unmarshaller u = c.createUnmarshaller();
    u.setSchema(schema);
    CalculateBorrowingDataResponseType b = 
      u.unmarshal(new StreamSource(xmlStream), CalculateBorrowingDataResponseType.class);
    

    顺便说一句,在这个模式意识文档builderness awesomeness的顶部有很多信息,你一定要看看

    您是手工还是使用XJC创建JAXB类的?另外,您引用的SimpleType.xsd是什么?如果没有这些信息,很难运行快速测试。实际上,我尝试了XJC和eclipse插件(使用maven central的jaxb-2.1.9-osgi作为pom中的jaxb实现)。我在两方面都犯了同样的错误。我已经编辑了上面的问题,并用包含SimpleType.XSD中相关类型的新版本替换了原始XSD模式,这样就只有一个模式文件,不再依赖SimpleType.XSD。不过,为了清楚起见,我保留了原始的名称空间标识符。我还编辑了我的帖子,添加了CalculateBrowingDataResponse.xml sample data.Wow的定义。非常感谢你在这件事上花了这么多时间。我花了8个多小时在这上面,但这也是我首先要解决的问题。如果我能投你更多的票,我会。:)我想我大概在同一时间得出了相同的结论;我没有意识到DocumentBuilderFactory在默认情况下是不支持名称空间的,而且,我也不知道它会起到如此大的作用。当我发现一个名为DOMUtils()的类时,我被吸引住了。@EricB。我没有意识到DocumentBuilderFactory在默认情况下是不支持名称空间的,而且,我也不知道它会起到如此大的作用。我也是,但这对我们来说是一个很好的教训,以便我们将来更彻底地检查文档。:)谢谢你的帮助。不幸的是,我的JaxB问题仍然存在;脉络相似,但问题不同。这一次,从JAXB生成的类生成的模式是不完整的。如有任何建议,将不胜感激。我创建了一个新线程,因为它是一个不同的问题。尊敬您花4小时调查这个问题!我的投票完全是为了那个。。。