- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我试图解析一个 xml 并将其解码为一个程序。这是示例 xml:
<MaintenanceTransaction:provideCommunicationEvents_BatchRequest
xmlns:MaintenanceTransaction="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MaintenanceTransaction:maintenanceTransaction>
<MaintenanceTransaction:eventInitiatedBy>
<MaintenanceTransaction:identifier>FINACLE</MaintenanceTransaction:identifier>
</MaintenanceTransaction:eventInitiatedBy>
<MaintenanceTransaction:transactionDate>2014-06-21T19:00:32.356+01:00</MaintenanceTransaction:transactionDate>
<MaintenanceTransaction:maintenanceTransactionType>PRE-NOTIFICATION
</MaintenanceTransaction:maintenanceTransactionType>
<MaintenanceTransaction:maintenanceEntries>
<MaintenanceTransaction:hasNewValues xsi:type="MaintenanceTransaction:DepositArrangement">
<MaintenanceTransaction:enterpriseId xsi:type="MaintenanceTransaction:ArrangementIdentifier">
<MaintenanceTransaction:identifier>222000000322</MaintenanceTransaction:identifier>
<MaintenanceTransaction:enterpriseIdType>Term Deposit</MaintenanceTransaction:enterpriseIdType>
</MaintenanceTransaction:enterpriseId>
<MaintenanceTransaction:maturityDate>2014-10-08</MaintenanceTransaction:maturityDate>
</MaintenanceTransaction:hasNewValues>
</MaintenanceTransaction:maintenanceEntries>
</MaintenanceTransaction:maintenanceTransaction>
</MaintenanceTransaction:provideCommunicationEvents_BatchRequest>
xsd定义为:
<xsd:schema xmlns:MaintenanceTransaction="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02" elementFormDefault="qualified" attributeFormDefault="qualified">
<xsd:include schemaLocation="./commonIFWxsd/IFWXML.xsd" />
<xsd:include schemaLocation="./commonIFWxsd/Event.xsd" />
<xsd:include schemaLocation="./commonIFWxsd/Arrangement.xsd" />
<!-- end of TYPES REQUIRED FOR PARAMETERS -->
<xsd:complexType name="provideCommunicationEvents_BatchRequest">
<xsd:sequence>
<xsd:element name="maintenanceTransaction" type="MaintenanceTransaction:MaintenanceTransaction" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<!-- TYPES REQUIRED FOR PARAMETERS -->
<xsd:element name="provideCommunicationEvents_BatchRequest" type="MaintenanceTransaction:provideCommunicationEvents_BatchRequest" />
</xsd:schema>
使用我的 StaxEventItemReader 和 Jaxb2Marshaller 的以下设置:
<bean id="uploadEventMessageReader" parent="abstractUploadEventMessageReader" scope="step">
<property name="resource" value="file:#{jobExecutionContext['fileToProcess']}"/>
<property name="fragmentRootElementName" value="maintenanceTransaction"/>
<property name="unmarshaller" ref="maintenanceTransactionUnmarshaller"/>
</bean>
<bean id="maintenanceTransactionUnmarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller" scope="step">
<property name="classesToBeBound">
<list>
<value>com.pwx.crs.informationcollection.ifw.process.model.mt.MaintenanceTransaction</value>
</list>
</property>
</bean>
但是问题是我得到了以下异常。
* [javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02", local:"maintenanceTransaction"). Expected elements are (none)] on step uploadEventMessages, with message: uploadEventMessagesStep.
* --stacktrace:com.pwx.crs.frwk.exp.technical.CRS2UnexpectedBatchException: An unexpected exception occurred in batch job JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException
知道这是什么意思吗?
当我像这样稍微更改输入xml的maintenanceTransaction开始标记时:
<MaintenanceTransaction:maintenanceTransaction xsi:type="MaintenanceTransaction:MaintenanceTransaction">
确实有效。但这不是一个解决方案,因为客户端不会像那样提供输入 xml。那么为什么会发生错误呢?确定维护事务属于哪个类似乎存在问题。
还在 marshaller bean 定义上尝试了不同的方法:
<bean id="maintenanceTransactionUnmarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller" scope="step">
<property name="contextPath" value="com.pwx.crs.informationcollection.ifw.process.model.mt"/>
</bean>
和
<bean id="maintenanceTransactionUnmarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller" scope="step">
<property name="classesToBeBound">
<list>
<value>com.pwx.crs.informationcollection.ifw.process.model.mt.ObjectFactory</value>
</list>
</property>
</bean>
两者的结果与第一个错误相同且相似
javax.xml.bind.UnmarshalException:意外元素(uri:“http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02”,本地:“maintenanceTransaction”)。预期的元素是 <{ http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02 }AccessTokenLifecycleStatus>...这里是包中类的完整列表。
但是 xml 对 xsd 完全有效,因为这是事先完成的。想法、建议……我可以试试吗?
最佳答案
这是我的理论。
mappedClass
实际上所做的是将解码方法从unmarshaller.unmarshal(source)
切换到unmarshaller.unmarshal(source, this.mappedClass)
。这称为“部分解码”,即无论元素名称如何,您都可以从某个元素中解码已知类。
所以,正如您所说,这对您有用。它也不是没有mappedClass
。这意味着您缺少根元素的元素声明。这也与您报告的错误非常吻合:
javax.xml.bind.UnmarshalException: unexpected element
(uri:"http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02",
local:"maintenanceTransaction"). Expected elements are (none)
说的基本一样。
这也是正确的。由于您的架构没有为 maintenanceTransaction
声明全局元素,因此仅针对 provideCommunicationEvents_BatchRequest
。
所以,基本上你解码了错误的元素。由于您的架构没有声明,因此失败。但是,如果您确切地指定了您想要的类型(从而“明确地”提供声明),那么它就可以工作。
接下来的问题是,为什么要解码错误的元素。我猜这是因为你有
<property name="fragmentRootElementName" value="maintenanceTransaction"/>
这可能指向解码器使用 maintenanceTransaction
元素作为根元素。所以 unmarshaller 被应用到了错误的元素上。
使用 contextPath
,添加更多绑定(bind)类等都无济于事,因为它没有为 maintenanceTransaction
添加元素声明。
现在,如何解决这个问题。我看到以下选项:
maintenanceTransaction
的全局元素添加到您的架构中MaintenanceTransaction
@XmlRootElement
fragmentRootElementName
,解码 provideCommunicationEvents_BatchRequest
mappedClass
如果您在此处处理特定情况,即 maintenanceTransaction
,那么我将使用 fragmentRootElementName
/mappedClass
组合。就像你现在做的那样。
关于StaxEventItemReader 中的 Jaxb2Marshaller 导致 UnmarshalException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26472837/
我遇到了 ClassCaseException 问题。我在 Spring 批处理中创建了 XStreamItemEventReader 来读取 xml 并将结果写入数据库。我阅读 xml 的读者应该将
在运行spring batch的项目时出现异常! 异常详情: Caused by: java.lang.NullPointerException: null at org.springframewor
在运行spring batch的项目时出现异常! 异常详情: Caused by: java.lang.NullPointerException: null at org.springframewor
所以我试图解析一个 xml 并将其解码为一个程序。这是示例 xml: FINACLE 2014-06-21T19
现在在我看来,StaxEventItemReader 没有提供任何方法来显式指定从 Spring Batch 3.x 和 4.x 开始解码的 xml 的字符编码。我对吗?有没有人找到解决这个问题的方法
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我有一个名称中带有 # 的输入文件 (UPX#L.xxxxx001.xml)。 Spring Batch StaxEventItemReader 无法打开此文件。无论如何要逃避这个特殊角色?请指教。
请帮我写 ItemReader() 05/28/2016 75 1
我是一名优秀的程序员,十分优秀!