2012-11-27 23 views
1

我有以下JAXB注释类(含XJC生成)JAXB解组有和没有的JAXBElement

@XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "ReplicateTransactionDataNotificationType", namespace = "http://esb.pkobp/adapter/calypso/tradekast/transaction", propOrder = { 
     "operationContext", 
     "transactionData" 
    }) 
    public class ReplicateTransactionDataNotificationType 
     implements Serializable 
    { 

     @XmlElement(name = "OperationContext", required = true) 
     protected OperationContextType operationContext; 
     @XmlElement(name = "TransactionData") 
     protected TransactionDataType transactionData; 

     public OperationContextType getOperationContext() { 
      return operationContext; 
     } 

     public void setOperationContext(OperationContextType value) { 
      this.operationContext = value; 
     } 

     public TransactionDataType getTransactionData() { 
      return transactionData; 
     } 

     public void setTransactionData(TransactionDataType value) { 
      this.transactionData = value; 
     } 

    } 

当以下列方式解组它,一切都运行得很好:

JAXBContext ctx = JAXBContext.newInstance(ReplicateTransactionDataNotificationType.class); 
    Unmarshaller unmarshaller = ctx.createUnmarshaller(); 
    JAXBElement<ReplicateTransactionDataNotificationType> result; 
    result = unmarshaller.unmarshal(new StreamSource(new ByteArrayInputStream(xmlString.getBytes())), ReplicateTransactionDataNotificationType.class); 

当以下列方式解组它,它崩溃,例外

(ReplicateTransactionDataNotificationType)unmarshaller.unmarshal(new StringReader(xmlString)); 

例外:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://esb.pkobp/adapter/calypso/tradekast/transaction", local:"caltradetran_ReplicateTransactionDataNotification"). Expected elements are (none) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:249) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1049) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:478) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:148) 
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) 
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) 
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:194) 
    at myPackage.XMLTranslationResolver.main(KondorXMLTranslationResolver.java:120) 

这个古怪的行为能够解释吗?

XML文件被解组下面粘贴:

<?xml version="1.0" encoding="UTF-8"?> 
<caltradetran:caltradetran_ReplicateTransactionDataNotification xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                   xmlns:fn="http://www.w3.org/2005/xpath-functions" 
                   xmlns:caltradetran="http://esb.pkobp/adapter/calypso/tradekast/transaction" 
                   xmlns:tran="http://esb.pkobp/cdm/treasury/transaction"> 
    <OperationContext> 
     <RequestID>98573c9c-6167-4edb-a5ff-8ad3db9983ef</RequestID> 
     <EventSource>KONDOR</EventSource> 
     <EventDate>2012-11-13T12:13:42.937+01:00</EventDate> 
    </OperationContext> 
    <TransactionData> 
     <ExternalReferenceKp>FWD57658</ExternalReferenceKp> 
     <DealTableID>95</DealTableID> 
     <Action>INS</Action> 
     <TransactionAdditionalData> 
     <ExternalReferenceKp>FWD57658</ExternalReferenceKp> 
     <ExternalReferenceTr/> 
     <ClientPID>123456</ClientPID> 
     <ProductSubType>FXForward</ProductSubType> 
     <SourceSystem>Kondor+</SourceSystem> 
     <AdditionalParameterList> 
      <Parameter> 
       <Name>TransactionType</Name> 
       <ValueType>string</ValueType> 
       <StringValue>Spekulacja</StringValue> 
      </Parameter> 
      <Parameter> 
       <Name>ReceiveFrom_AccountNo</Name> 
       <ValueType>string</ValueType> 
       <StringValue>test</StringValue> 
      </Parameter> 
      <Parameter> 
       <Name>ReceiveFrom_SettleMethod</Name> 
       <ValueType>string</ValueType> 
       <StringValue>DIRECT</StringValue> 
      </Parameter> 
      <Parameter> 
       <Name>ReceiveTo_AccountNo</Name> 
       <ValueType>string</ValueType> 
       <StringValue>test</StringValue> 
      </Parameter> 
      <Parameter> 
       <Name>ReceiveTo_SettleMethod</Name> 
       <ValueType>string</ValueType> 
       <StringValue>DIRECT</StringValue> 
      </Parameter> 
      <Parameter> 
       <Name>PayFrom_AccountNo</Name> 
       <ValueType>string</ValueType> 
       <StringValue>test</StringValue> 
      </Parameter> 
      <Parameter> 
       <Name>PayFrom_SettleMethod</Name> 
       <ValueType>string</ValueType> 
       <StringValue>DIRECT</StringValue> 
      </Parameter> 
      <Parameter> 
       <Name>PayTo_AccountNo</Name> 
       <ValueType>string</ValueType> 
       <StringValue>test</StringValue> 
      </Parameter> 
      <Parameter> 
       <Name>PayTo_SettleMethod</Name> 
       <ValueType>string</ValueType> 
       <StringValue>DIRECT</StringValue> 
      </Parameter> 
     </AdditionalParameterList> 
     </TransactionAdditionalData> 
     <ForwardDeal> 
     <FILE>1105_133831_INS.00057658.00072904</FILE> 
     <ACTION>INS</ACTION> 
     <TRANS_ID>72904</TRANS_ID> 
     <XACTKEY>350000000353842604</XACTKEY> 
     <OPERATIONS>3</OPERATIONS> 
     <MAIN_DEAL_TABLE_ID>95</MAIN_DEAL_TABLE_ID> 
     <MAIN_DEAL_ID>57658</MAIN_DEAL_ID> 
     <ORIGINAL_TYPE_OF_EVENT>K</ORIGINAL_TYPE_OF_EVENT> 
     <DEALS_INSTRUMENT_ID>13</DEALS_INSTRUMENT_ID> 
     <DEALS_OPERATION_ID>0</DEALS_OPERATION_ID> 
     <MESSAGE_SOURCE>RealTime</MESSAGE_SOURCE> 
     <DEALS_OPERATION>INSERT</DEALS_OPERATION> 
     </ForwardDeal> 
    </TransactionData> 
</caltradetran:caltradetran_ReplicateTransactionDataNotification> 

回答

4

您需要创建JAXBContext时包括ObjectFactory类。 ObjectFactory包含含有根元素信息的@XmlElementDecl注释。我建议在生成的模型的包名称上创建JAXBContext

更多信息

+0

OK,这与博客条目一起,回答我的问题有点。当我使用包声明创建JAXBContext时,它工作正常,我得到了JAXBElement。当我将@XmlRootElement添加到我的类时,我得到了域对象。我仍然需要弄清楚如何使用JAXB处理名称空间 –

+0

@ user1200125 - 我写了以下关于JAXB和命名空间的帮助:http://blog.bdoughan.com/2010/08/jaxb-namespaces.html –

+0

非常感谢许多!我错过的只是@XmlElementDecl位,但是感谢这篇文章,我已经将它全部工作了! – paulscott56