我知道這與其他許多帖子是幾乎相同的,例如, 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>
任何人都可以請幫助其他可能的解決方案嗎?謝謝。