使用Spring Batch StaxEventItemReader读取XML时如何设置Field3为可选字段
你当前的字段必填校验逻辑不是来自StaxEventItemReader,而是来自你使用的XStreamMarshaller反序列化策略,按以下步骤调整即可实现Field3可选:
调整步骤
- 第一步:匹配XML标签规则+适配可选字段
首先确保DataWrapper类中Field3对应的字段使用包装数据类型(不可用int、boolean等基本类型,基本类型无null值,XML无对应节点时会触发赋值错误),同时要适配XML中带空格的标签名,两种配置方式二选一:
方式1:注解配置(直接修改DataWrapper类)
方式2:代码配置(无需修改实体类,直接在当前配置代码中添加)// 其余Field1、Field2也按相同规则配置别名 @XStreamAlias("Field 1") private String field1; @XStreamAlias("Field 2") private String field2; // Field3用包装类型,允许为null @XStreamAlias("Field 3") private String field3;// 给字段配置别名,匹配XML中带空格的标签名 xStreamMarshaller.getXStream().aliasField("Field 1", DataWrapper.class, "field1"); xStreamMarshaller.getXStream().aliasField("Field 2", DataWrapper.class, "field2"); xStreamMarshaller.getXStream().aliasField("Field 3", DataWrapper.class, "field3"); - 第二步:添加容错配置(推荐)
新增XStream忽略未知元素配置,后续XML新增未在实体类中定义的字段时也不会触发解析报错:xStreamMarshaller.getXStream().ignoreUnknownElements();
修改后的完整配置代码
StaxEventItemReader<DataWrapper> reader = new StaxEventItemReader<DataWrapper>(); reader.setResource(new PathResource(filePath)); reader.setFragmentRootElementName("MY_LIST"); Map<String, Class<?>> aliases = new HashMap<>(); aliases.put("MY_LIST", DataWrapper.class); XStreamMarshaller xStreamMarshaller = new XStreamMarshaller(); xStreamMarshaller.setAliases(aliases); xStreamMarshaller.getXStream().addPermission(AnyTypePermission.ANY); // 新增:忽略未知元素 xStreamMarshaller.getXStream().ignoreUnknownElements(); // 新增:字段别名配置,如果你用了注解方式可以删掉下面三行 xStreamMarshaller.getXStream().aliasField("Field 1", DataWrapper.class, "field1"); xStreamMarshaller.getXStream().aliasField("Field 2", DataWrapper.class, "field2"); xStreamMarshaller.getXStream().aliasField("Field 3", DataWrapper.class, "field3"); reader.setUnmarshaller(xStreamMarshaller); SynchronizedItemStreamReader<DataWrapper> synchronizedItemStreamReader = new SynchronizedItemStreamReader<>(); synchronizedItemStreamReader.setDelegate(reader); return synchronizedItemStreamReader;
调整完成后,XML中存在Field3节点时会自动赋值到对应字段,不存在时对应字段值为null,不会触发解析错误。
内容的提问来源于stack exchange,提问作者Ravindra Kushwaha
相关产品推荐
相关产品推荐

