Java Spring引导批处理-读取XML输入-将元素转换为列表

Java Spring引导批处理-读取XML输入-将元素转换为列表,java,xml,spring,spring-boot,spring-batch,Java,Xml,Spring,Spring Boot,Spring Batch,我必须使用SpringBoot编写一个批处理服务,该服务将XML文件作为输入读取。 XML输入的结构如下所示,我无法更改: <root> <parent> <field1>string</field1> <field2>string</field2> <field3>string</field2> <child>

我必须使用SpringBoot编写一个批处理服务,该服务将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>
我理解这个错误,但我找不到纠正代码的方法。 我试图在Parent中创建一个假的setter,将该子对象添加到children列表中。但它似乎不起作用

有什么想法吗?

重命名此属性:

private List<Child> children;
私有列表子项;

私有列表子项;

并重新创建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;
}
@Bean
公共项目阅读器(){
statxeventitemreader reader=新的statxeventitemreader();
setResource(新类路径资源(“input.xml”);
reader.setFragmentRootElementName(“父项”);
Jaxb2Marshaller unmarshaller=新的Jaxb2Marshaller();
unmarshaller.setClassesToBeBound(Parent.class,Child.class);
reader.setUnmarshaller(unmarshaller);
返回读取器;
}
对于Java bean:

@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...
}
@XmlRootElement(name=“parent”)
公共类父类{
私有字符串字段1;
私有字符串字段2;
私有字符串字段3;
私人名单儿童;
//接球手和接球手。。。
}
公营儿童{
私有字符串字段a;
私有字符串字段b;
//接球手和接球手。。。
}

即使使用自动生成的getter和setter,这也可以正常工作:我恢复子元素的列表。

我应该在getter方法中添加什么?如果我返回列表,批处理将尝试调用列表上的setFieldA(),但失败。
private List<Child> children;
private List<Child> child;
@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;
}
@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...
}