2017-07-04 148 views
0

我知道這與其他許多帖子是幾乎相同的,例如, JAXB doesn't unmarshall after updating java from 1.8.0_77 to 1.8.0_121 但這些答案或評論都沒有解決我的問題。將Java從1.8.0_45更新到1.8.0_131後,JAXB unmarshall字段爲空

(我也檢查了樣品這裏https://github.com/KlausGroenbaek/jaxbissue,並通過這個博客http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html讀)

我升級我的Java 8,現在許多的使用示例XML文件測試失敗。

unmarshall返回一個所有字段都爲null的對象。

我不想要一個需要修改package-info或ObjectFactory的解決方案,因爲它們會自動重新生成並覆蓋所做的任何更改。

我聽說在其他地方,在POM Maven的選項

<strict>false</strict> 

應該幫助,但它沒有。

我不確定它是否有相關差異,但我的schema xsd是在外部項目中定義的。

EDMS.xsd(伊甸園套房項目)

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:tns="urn:www.edenportal.com.au:exchange:edms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="urn:www.edenportal.com.au:exchange:edms" 
      elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0"> 

    <xsd:element name="edmsExchangeData" type="tns:edmsExchange" /> 

    <xsd:complexType name="edmsExchange"> 
    <xsd:sequence> 
     <xsd:element name="received" type="xsd:dateTime" /> 
     <xsd:element name="sourceSystem" type="xsd:string" nillable="true" /> 
     <xsd:element name="rawActivityDataList" type="tns:ActivityData" minOccurs="1" maxOccurs="unbounded" /> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="ActivityData"> 
    <xsd:sequence> 
     <xsd:element name="networkItemId" type="xsd:long" /> 
     <xsd:element name="description" type="xsd:string" /> 
     <xsd:element name="dateFrom" type="xsd:dateTime" /> 
     <xsd:element name="dateTo" type="xsd:dateTime" /> 
     <xsd:element name="originalDataSourceFormat" type="tns:OriginalDataSource" /> 
     <xsd:element name="rawActivityDataItems"> 
     <xsd:complexType> 
      <xsd:sequence> 
      <xsd:element name="rawActivityDataItem" minOccurs="1" maxOccurs="unbounded"> 
       <xsd:complexType> 
       <xsd:sequence> 
        <xsd:element name="key" type="xsd:string" /> 
        <xsd:element name="value" type="xsd:string" /> 
       </xsd:sequence> 
       </xsd:complexType> 
      </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:simpleType name="OriginalDataSource"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="FuelBilling" /> 
     <xsd:enumeration value="ElectricityBilling" /> 
     <xsd:enumeration value="GasBilling" /> 
     <xsd:enumeration value="WaterBilling" /> 
     <xsd:enumeration value="ElectricityInterval" /> 
     <xsd:enumeration value="WasteBilling" /> 
     <xsd:enumeration value="Paper" /> 
     <xsd:enumeration value="AirTravel" /> 
     <xsd:enumeration value="Other" /> 
    </xsd:restriction> 
    </xsd:simpleType> 

</xsd:schema> 

的解組代碼(在伊甸園節點項目):

private JAXBContext edmsExchangeJaxbContext; 

    public EdmsExchangeUnmarshaller() { 
     try { 
      edmsExchangeJaxbContext = JAXBContext.newInstance("au.com.edenportal.exchange.edms"); 

... 

    public EdmsExchange unmarshallEdmsMessage(MessageBody messageBody) { 

... 
     Reader inputReader = null; 

     if (messageBody.getBinaryContent() != null) { 
      LOG.debug("Reading MessageBody as binary... "); 
      inputReader = new InputStreamReader(new ByteArrayInputStream(messageBody.getBinaryContent().getValue())); 
     } else if (messageBody.getTextContent() != null) { 
      LOG.debug("Reading MessageBody as text... "); 
      inputReader = new StringReader(messageBody.getTextContent()); 
     } 

     Object unmarshalledObject = null; 
     try { 

      Unmarshaller unmarshaller = edmsExchangeJaxbContext.createUnmarshaller(); 
      unmarshalledObject = unmarshaller.unmarshal(inputReader); 
      inputReader.close(); 
     } catch (JAXBException e) { 
      throw new ExchangeUnmarshallingException("Could not unmarshall payload", e); 
     } catch (IOException io) { 
      throw new ExchangeUnmarshallingException("IO error when parsing", io); 
     } 

     @SuppressWarnings("unchecked") 
     EdmsExchange edmsExchange = ((JAXBElement<EdmsExchange>) unmarshalledObject).getValue(); 
     return edmsExchange; 

    } 

原始XML樣本測試文件(在伊甸園節點項目中)在1.8.0_45中工作,但現在不在1.8.0_131中:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<edmsExchangeData xmlns="urn:www.edenportal.com.au:exchange:edms"> 
    <sourceSystem xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
    <rawActivityDataList> 
     <description>Fuel usage</description> 
     <dateFrom>2011-02-15T00:00:00.000+10:00</dateFrom> 
     <dateTo>2011-02-15T00:00:00.000+10:00</dateTo> 
     <originalDataSourceFormat>FuelBilling</originalDataSourceFormat> 
     <rawActivityDataItems> 
      <rawActivityDataItem> 
       <key>id</key> 
       <value>1924</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelCard.id</key> 
       <value>1503</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelCard.node</key> 
       <value>au.gov.vic.fuel</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelCard.cardNumber</key> 
       <value>7307992</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelCard.supplierName</key> 
       <value>au.com.shell</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>customer.customerName</key> 
       <value>POLICE FORCE VICTORIA</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>customer.customerIdentifier</key> 
       <value>573537</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.fuelCost</key> 
       <value>61.84</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.quantityLitres</key> 
       <value>51.54</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.pumpPricePerLitre</key> 
       <value>1.33</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.productType</key> 
       <value>GASOLINE</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.unitPricePerLitre</key> 
       <value>1.32</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.fuelCostInclGST</key> 
       <value>68.02</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.totalCostIncTax</key> 
       <value>68.02</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.totalTax</key> 
       <value>6.18</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.invoiceNumber</key> 
       <value>549</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.transactionDate</key> 
       <value>2011-02-15 00:00 +1000</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.totalCostExTax</key> 
       <value>61.84</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.invoiceDate</key> 
       <value>2011-02-15 00:00 +1000</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.taxRatePercent</key> 
       <value>0.1</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>vehicle.odometer</key> 
       <value>28694</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>vehicle.regoState</key> 
       <value>AUS</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>vehicle.rego</key> 
       <value>MCE721H</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.receivedDate</key> 
       <value>2011-04-13 11:15 +1000</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.insertedDate</key> 
       <value>2011-04-13 11:15 +1000</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.nodeName</key> 
       <value>au.gov.vic.fuel</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.version</key> 
       <value>0</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.currencyCode</key> 
       <value>AUD</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.correlationId</key> 
       <value>e23014f7-2290-44f0-94ff-99a5df6a148e</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.id</key> 
       <value>5</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>supplier.id</key> 
       <value>5</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>supplier.name</key> 
       <value>au.com.shell</value> 
      </rawActivityDataItem> 
     </rawActivityDataItems> 
    </rawActivityDataList> 
    <rawActivityDataList> 
     <description>Fuel usage</description> 
     <dateFrom>2011-02-08T00:00:00.000+10:00</dateFrom> 
     <dateTo>2011-02-08T00:00:00.000+10:00</dateTo> 
     <originalDataSourceFormat>FuelBilling</originalDataSourceFormat> 
     <rawActivityDataItems> 
      <rawActivityDataItem> 
       <key>id</key> 
       <value>2483</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelCard.id</key> 
       <value>400</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelCard.node</key> 
       <value>au.gov.vic.fuel</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelCard.cardNumber</key> 
       <value>7744906</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelCard.supplierName</key> 
       <value>au.com.shell</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>customer.customerName</key> 
       <value>POLICE FORCE VICTORIA</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>customer.customerIdentifier</key> 
       <value>573537</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.fuelCost</key> 
       <value>27.7</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.quantityLitres</key> 
       <value>23.41</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.pumpPricePerLitre</key> 
       <value>1.39</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.productType</key> 
       <value>GASOLINE</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.unitPricePerLitre</key> 
       <value>1.3</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>fuelDetail.fuelCostInclGST</key> 
       <value>30.47</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.totalCostIncTax</key> 
       <value>30.47</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.totalTax</key> 
       <value>2.77</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.invoiceNumber</key> 
       <value>549</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.transactionDate</key> 
       <value>2011-02-08 00:00 +1000</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.totalCostExTax</key> 
       <value>27.7</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.invoiceDate</key> 
       <value>2011-02-15 00:00 +1000</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>invoice.taxRatePercent</key> 
       <value>0.1</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>vehicle.odometer</key> 
       <value>22627</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>vehicle.regoState</key> 
       <value>AUS</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>vehicle.rego</key> 
       <value>XVV759</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.receivedDate</key> 
       <value>2011-04-13 11:15 +1000</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.insertedDate</key> 
       <value>2011-04-13 11:15 +1000</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.nodeName</key> 
       <value>au.gov.vic.fuel</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.version</key> 
       <value>0</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.currencyCode</key> 
       <value>AUD</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.correlationId</key> 
       <value>e23014f7-2290-44f0-94ff-99a5df6a148e</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>statement.id</key> 
       <value>5</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>supplier.id</key> 
       <value>5</value> 
      </rawActivityDataItem> 
      <rawActivityDataItem> 
       <key>supplier.name</key> 
       <value>au.com.shell</value> 
      </rawActivityDataItem> 
     </rawActivityDataItems> 
    </rawActivityDataList> 
</edmsExchangeData> 

XML示例測試文件(在Eden Node項目中) - 修改後的StackOverflow閱讀 - 這仍然不工作... -

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<e:edmsExchangeData xmlns:e="urn:www.edenportal.com.au:exchange:edms" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="urn:www.edenportal.com.au:exchange:edms EdmsExchange/Edms.xsd "> 
    <e:received>2011-04-13T00:00:00.000+10:00</e:received> 
    <e:sourceSystem xsi:nil="true"/> 
    <e:rawActivityDataList> 
     <e:networkItemId>1000000</e:networkItemId> 
     <e:description>Fuel usage</e:description> 
     <e:dateFrom>2011-02-15T00:00:00.000+10:00</e:dateFrom> 
     <e:dateTo>2011-02-15T00:00:00.000+10:00</e:dateTo> 
     <e:originalDataSourceFormat>FuelBilling</e:originalDataSourceFormat> 
     <e:rawActivityDataItems> 
      <e:rawActivityDataItem> 
       <e:key>id</e:key> 
       <e:value>1924</e:value> 
      </e:rawActivityDataItem> 
      <e:rawActivityDataItem> 
       <e:key>fuelCard.id</e:key> 
       <e:value>1503</e:value> 
      </e:rawActivityDataItem> 
... 
      <e:rawActivityDataItem> 
       <e:key>supplier.name</e:key> 
       <e:value>au.com.shell</e:value> 
      </e:rawActivityDataItem> 
     </e:rawActivityDataItems> 
    </e:rawActivityDataList> 
    <e:rawActivityDataList> 
     <e:networkItemId>1000001</e:networkItemId> 
     <e:description>Fuel usage</e:description> 
     <e:dateFrom>2011-02-08T00:00:00.000+10:00</e:dateFrom> 
     <e:dateTo>2011-02-08T00:00:00.000+10:00</e:dateTo> 
     <e:originalDataSourceFormat>FuelBilling</e:originalDataSourceFormat> 
     <e:rawActivityDataItems> 
      <e:rawActivityDataItem> 
       <e:key>id</e:key> 
       <e:value>2483</e:value> 
      </e:rawActivityDataItem> 
      <e:rawActivityDataItem> 
       <e:key>fuelCard.id</e:key> 
       <e:value>400</e:value> 
      </e:rawActivityDataItem> 
... 

      <e:rawActivityDataItem> 
       <e:key>supplier.name</e:key> 
       <e:value>au.com.shell</e:value> 
      </e:rawActivityDataItem> 
     </e:rawActivityDataItems> 
    </e:rawActivityDataList> 
</e:edmsExchangeData> 

任何人都可以請幫助其他可能的解決方案嗎?謝謝。

回答

0

正如在原來的文章中,我也遇到了同樣的問題,而運行在不同的Java版本。 我添加了以下依賴項,並解決了我的問題

<dependency> 
     <groupId>org.jvnet.jaxb2.maven2</groupId> 
     <artifactId>maven-jaxb2-plugin</artifactId> 
     <version>0.13.3</version> 
    </dependency>