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



我必须使用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类:

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:

@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列表中。但它似乎不起作用。

我使用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 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...
}

这工作得很好,即使使用自动生成的getter和setter:我恢复了子元素的列表。

重命名此属性:

private List<Child> children;

private List<Child> child;

最新更新