2012-07-06 88 views
1

我試圖來解讀一個基本的XML文件,該文件如下:問題與JAXB和Spring OXM

<?xml version="1.0" encoding="UTF-8"?> 
<personnes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="personnes.xsd"> 
    <personne> 
    <prenom>toto</prenom> 
    <nom>dupont</nom> 
    </personne> 
    <personne> 
    <prenom>titi</prenom> 
    <nom>durand</nom> 
    </personne> 
    <personne> 
    <prenom>tata</prenom> 
    <nom>lanvin</nom> 
    </personne> 
</personnes> 

相應的XSD是在這裏:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="personnes"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="personne" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="prenom" type="xs:string" /> 
          <xs:element name="nom" type="xs:string" /> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

我係統地得到一個UnmarshallingFailureException:

Caused by: org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'personne'.] 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:664) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:585) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:568) 
    at org.springframework.batch.item.xml.StaxEventItemReader.doRead(StaxEventItemReader.java:227) 
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:85) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:90) 
    at org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:87) 
    ... 56 more 
Caused by: javax.xml.bind.UnmarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'personne'.] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshalStaxSource(Jaxb2Marshaller.java:597) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:578) 
    ... 61 more 
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'personne'. 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.startElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXEventConnector.handleStartElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXEventConnector.bridge(Unknown Source) 
    ... 65 more 

您的信息我使用Spring OXM。

我強烈懷疑這與我的XSD架構做,可能命名空間...

任何人都可以請幫助?

編輯:下面是相關的Spring配置:

<bean id="personneItemReader" class="org.springframework.batch.item.xml.StaxEventItemReader"> 
     <property name="resource" value="classpath:personnes.xml" /> 
     <property name="fragmentRootElementName" value="personne" /> 
     <property name="unmarshaller" ref="jaxb2Marshaller" /> 
    </bean> 

    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
     <property name="classesToBeBound"> 
      <list> 
       <value>com.docapost.batch.xml.Personnes</value> 
      </list> 
     </property> 
     <property name="schema" value="classpath:personnes.xsd" /> 
    </bean> 

編輯2:異常跟蹤,如果我註釋掉架構驗證:

Caused by: org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException 
- with linked exception: 
[javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"personne"). Expected elements are <{}personnes>] 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:664) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:585) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:568) 
    at org.springframework.batch.item.xml.StaxEventItemReader.doRead(StaxEventItemReader.java:227) 
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:85) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:90) 
    at org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:87) 
    ... 56 more 
Caused by: javax.xml.bind.UnmarshalException 
- with linked exception: 
[javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"personne"). Expected elements are <{}personnes>] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshalStaxSource(Jaxb2Marshaller.java:597) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:578) 
    ... 61 more 
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"personne"). Expected elements are <{}personnes> 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXEventConnector.handleStartElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXEventConnector.bridge(Unknown Source) 
    ... 65 more 
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"personne"). Expected elements are <{}personnes> 
    ... 75 more 
+1

當您在Spring環境之外運行JAXB時,是否看到相同的異常? – 2012-07-06 15:14:11

+0

好點:它可以在Spring以外的地方使用... – balteo 2012-07-06 15:47:03

+0

你可以發佈任何Spring相關的配置嗎? – 2012-07-06 15:49:10

回答

2

似乎沒有成爲一個鏈接是personne元素和Personne類。如果你生成你的模型,你可以嘗試改變你的配置使用上下文路徑?

<bean id="personneItemReader" class="org.springframework.batch.item.xml.StaxEventItemReader"> 
    <property name="resource" value="classpath:personnes.xml" /> 
    <property name="fragmentRootElementName" value="personnes" /> 
    <property name="unmarshaller" ref="jaxb2Marshaller" /> 
</bean> 

<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="contextPath" value="ocom.docapost.batch.xml"/> 
</bean> 
+0

問題是,單個項目是「personne」標籤,而不是包含「personnes」標籤......請參閱包含的XML。 – balteo 2012-07-06 15:58:28

+0

另請參見[spring批處理參考文檔](http://static.springsource.org/spring-batch/reference/html/readersAndWriters.html#StaxEventItemReader) – balteo 2012-07-06 16:01:29

+0

如果註釋掉'。 – 2012-07-06 16:02:23