Spring 启动批处理 - 读取 XML 输入 - 将元素转换为列表
Spring Boot batch - reading XML input - convert elements to list
我必须编写一个批处理服务,使用 Spring Boot,读取 XML 文件作为输入。
XML 输入的结构如下所示,我无法更改它:
<root>
<parent>
<field1>string</field1>
<field2>string</field2>
<field3>string</field2>
<child>
<fieldA>string</fieldA>
<fieldB>string</fieldB>
</child>
<child>
<fieldA>string</fieldA>
<fieldB>string</fieldB>
</child>
<child>
<fieldA>string</fieldA>
<fieldB>string</fieldB>
</child>
</parent>
</root>
我已经创建了我的 Java classes :
public class Parent {
private String field1;
private String field2;
private String field3;
private List<Child> children;
// Getters and setters...
}
public class Child {
private String fieldA;
private String fieldB;
// Getters and setters...
}
这是我的 reader 在批处理配置 class :
@Bean
public ItemReader<Object> reader(){
StaxEventItemReader<Object> reader = new StaxEventItemReader<Object>();
reader.setResource( new ClassPathResource("input.xml") );
reader.setFragmentRootElementName("parent");
XStreamMarshaller unmarshaller = new XStreamMarshaller();
Map<String, Class> aliases = new HashMap<String, Class>();
aliases.put( "parent", Parent.class );
aliases.put( "child", Child.class );
unmarshaller.setAliases(aliases);
reader.setUnmarshaller( unmarshaller );
return reader;
}
现在我只是试着有一个正确的阅读。
但是当我运行批处理时,我有一个错误:
org.springframework.oxm.UnmarshallingFailureException: XStream unmarshalling exception; nested exception is com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field foo.bar.Parent.child
我理解这个错误,但我找不到更正代码的方法。
我试图在 Parent 中创建一个伪造的 setter,将 child 添加到 children 列表中。但是好像不行。
有什么想法吗?
重命名此 属性:
private List<Child> children;
到
private List<Child> child;
并重新创建 getter 和 setter 方法。
我使用 Jaxb2Marshaller 而不是 XStreamMarshaller 解决了这个问题:
@Bean
public ItemReader<Object> reader(){
StaxEventItemReader<Object> reader = new StaxEventItemReader<Object>();
reader.setResource( new ClassPathResource("input.xml") );
reader.setFragmentRootElementName("parent");
Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller();
unmarshaller.setClassesToBeBound( Parent.class, Child.class );
reader.setUnmarshaller( unmarshaller );
return reader;
}
对于 Java 个豆子:
@XmlRootElement(name = "parent")
public class Parent {
private String field1;
private String field2;
private String field3;
private List<Child> child;
// Getters and setters...
}
public class Child {
private String fieldA;
private String fieldB;
// Getters and setters...
}
这工作正常,即使使用自动生成的 getter 和 setter:我恢复了子元素列表。
我必须编写一个批处理服务,使用 Spring Boot,读取 XML 文件作为输入。 XML 输入的结构如下所示,我无法更改它:
<root>
<parent>
<field1>string</field1>
<field2>string</field2>
<field3>string</field2>
<child>
<fieldA>string</fieldA>
<fieldB>string</fieldB>
</child>
<child>
<fieldA>string</fieldA>
<fieldB>string</fieldB>
</child>
<child>
<fieldA>string</fieldA>
<fieldB>string</fieldB>
</child>
</parent>
</root>
我已经创建了我的 Java classes :
public class Parent {
private String field1;
private String field2;
private String field3;
private List<Child> children;
// Getters and setters...
}
public class Child {
private String fieldA;
private String fieldB;
// Getters and setters...
}
这是我的 reader 在批处理配置 class :
@Bean
public ItemReader<Object> reader(){
StaxEventItemReader<Object> reader = new StaxEventItemReader<Object>();
reader.setResource( new ClassPathResource("input.xml") );
reader.setFragmentRootElementName("parent");
XStreamMarshaller unmarshaller = new XStreamMarshaller();
Map<String, Class> aliases = new HashMap<String, Class>();
aliases.put( "parent", Parent.class );
aliases.put( "child", Child.class );
unmarshaller.setAliases(aliases);
reader.setUnmarshaller( unmarshaller );
return reader;
}
现在我只是试着有一个正确的阅读。 但是当我运行批处理时,我有一个错误:
org.springframework.oxm.UnmarshallingFailureException: XStream unmarshalling exception; nested exception is com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field foo.bar.Parent.child
我理解这个错误,但我找不到更正代码的方法。 我试图在 Parent 中创建一个伪造的 setter,将 child 添加到 children 列表中。但是好像不行。
有什么想法吗?
重命名此 属性:
private List<Child> children;
到
private List<Child> child;
并重新创建 getter 和 setter 方法。
我使用 Jaxb2Marshaller 而不是 XStreamMarshaller 解决了这个问题:
@Bean
public ItemReader<Object> reader(){
StaxEventItemReader<Object> reader = new StaxEventItemReader<Object>();
reader.setResource( new ClassPathResource("input.xml") );
reader.setFragmentRootElementName("parent");
Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller();
unmarshaller.setClassesToBeBound( Parent.class, Child.class );
reader.setUnmarshaller( unmarshaller );
return reader;
}
对于 Java 个豆子:
@XmlRootElement(name = "parent")
public class Parent {
private String field1;
private String field2;
private String field3;
private List<Child> child;
// Getters and setters...
}
public class Child {
private String fieldA;
private String fieldB;
// Getters and setters...
}
这工作正常,即使使用自动生成的 getter 和 setter:我恢复了子元素列表。