当前位置: 首页 > 知识库问答 >
问题:

有和没有jaxbElement的JAXB解组器

顾超
2023-03-14

我有下面的JAXB注释类(用XJC生成)

@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>

共有1个答案

洪开诚
2023-03-14

创建< code>JAXBContext时,需要包含< code>ObjectFactory类。< code>ObjectFactory包含< code>@XmlElementDecl批注,这些批注包含根元素信息。我建议在生成的模型的包名上创建< code>JAXBContext。

欲了解更多信息

  • http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html
 类似资料:
  • 问题内容: 在非官方指南中有一个占位符答案,带有指向(对我而言)似乎无关的文章的链接。 我使用XJC生成我的JAXB类,尽管它们大多数按预期相互映射,但有些元素被映射到。这对于带有循环的图最令人讨厌,其中有时Foo元素的父节点将是,而它本身没有父属性,从而中断了循环。 我可以想到各种解决方法,但是如果有人可以向我解释这种行为,那就更好了。为什么JAXB有时将元素映射到而不是Foo? 问题答案: 在

  • 我想使用JAXB来 将xml解组为java对象, 将其封送回xml 并使用名称空间生成完全相同的输出 下面是原始的 XML: 我正在使用以下POJO: 我用于取消/编组的代码: 这实际上不起作用,我甚至无法解组初始xml。但是如果我尝试封送一个POJO,我只在代码中设置字段。我得到以下结果: 我如何摆脱这个ns3前缀?

  • 我使用JAXB从SOAP响应中解析xml元素。我已经为xml元素定义了POJO类。我已经测试了没有名称空间和前缀的pojo类,它工作得很好。需求是解析来自SOAPMessage对象的输入

  • 我有两个代码,在两个不同的java项目中,执行几乎相同的操作(根据xsd文件解组Web服务的输入)。 但在一个例子中,我应该这样写:(Input是一个占位符名称)(element是OMElement Input) 在另一个库中,我必须使用JAXBElement。getValue(),因为它是返回的JAXBElement,并且简单(输入)转换会崩溃: 你知道是什么导致了这种差异吗?

  • 问题内容: 我正在尝试从FpML(金融产品标记语言)4.5版生成Java类。生成了大量代码,但是我不能使用它。尝试序列化一个简单的文档,我得到以下信息: 实际上,没有任何类具有@XmlRootElement批注,那么我该怎么做呢?我将xjc(JAXB 2.1)指向fpml-main-4-5.xsd,其中包括所有类型。 问题答案: v

  • 我关注了 json 根据给出的答案,我尝试了以下 我得到一个空数组,有如下错误。有什么建议吗? json:无法将数组解组为map[string]*json.RawMessage类型的Go值