java - Spring Batch - StaxEventItemReader 处理 xml 中的无效行
问题描述
我正在使用 Spring Batch 来读取 XML 文件。我想使用 XSD 验证记录。我可以使用运行验证,setSchema
但它会抛出异常并杀死整个工作。我的目标是处理这些无效记录,将它们保存到日志中并跳过它们以进行最终处理。
我的 StaxEcentItemReader
@Bean
@JobScope
public StaxEventItemReader<?> reader() throws Exception {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setClassesToBeBound(BookDto.class);
jaxb2Marshaller.setSchema(new ClassPathResource("book.xsd"));
jaxb2Marshaller.afterPropertiesSet();
return new StaxEventItemReaderBuilder<>()
.name("xmlReader")
.resource(new ClassPathResource("books.xml"))
.addFragmentRootElements("book")
.unmarshaller(jaxb2Marshaller)
.build();
}
XSD
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.test.com/xsd"
xmlns="http://www.test.com/xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="book" type="bookDto"/>
<xs:simpleType name="simAuthor">
<xs:restriction base="xs:string">
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="bookDto">
<xs:sequence>
<xs:element name="author" type="simAuthor" minOccurs="0"/>
<xs:element type="xs:float" name="price"/>
</xs:sequence>
<xs:attribute type="xs:string" name="id" use="required"/>
</xs:complexType>
</xs:schema>
项目
<?xml version="1.0"?>
<catalog>
<book xmlns="http://www.test.com/xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com/xsd" id="bk101">
<author>Gambardella, MatthewMatthewMatthewMatthewMatthewMatthewMatthewMatthew</author>
<price>44.95s</price>
</book>
<book xmlns="http://www.test.com/xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com/xsd" id="bk102">
<author>Ralls, Kim</author>
<price>5.95</price>
</book>
</catalog>
解决方案
我可以使用 setSchema 运行验证,但它会抛出异常并杀死整个工作。
您可以使用容错步骤并将异常声明为可跳过。有了这个,无效的项目将被跳过,作业将继续下一个项目,而不是在第一个无效项目上失败。有关更多详细信息,请参阅参考文档的配置跳过逻辑部分。
我的目标是处理这些无效记录,将它们保存到日志中并跳过它们以进行最终处理。
为此,您需要注册一个SkipListener并在需要时记录无效项目。
推荐阅读
- ios - 即使应用程序在前台运行,也会调用通知 - iOS12
- reactjs - 使用 redux 仅在 React 组件中获取部分存储/状态的最佳实践
- websocket - NestJS websocket 向客户端广播事件
- angular - Angular DevExtreme 主题
- ruby-on-rails - Ruby on Rails - RSpec 测试随机失败
- javascript - 动态更改翻译时的 CSS 动画
- ruby-on-rails - Redis 和 Sidekiq 在 Ubuntu 16.04 上使用 systemd 和使用 Capistrano 进行部署
- ruby-on-rails - 启动 RoR/最佳启动方式
- javascript - 声明变量 JavaScript 的性能影响
- firebase - Firestore 安全规则:“PERMISSION_DENIED:权限缺失或不足。”