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

标签 java xml spring spring-boot spring-batch

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

这是我在批处理配置类中的阅读器:

@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 添加到 child 列表中。但这似乎不起作用。

有什么想法吗?

最佳答案

我使用 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,这也能正常工作:我恢复了一个子元素列表。

关于java - Spring Boot 批处理 - 读取 XML 输入 - 将元素转换为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33032280/

相关文章:

java - 用java制作一个截屏软件

JavaScript EJB变量字段保存值?

java - XSD 验证中的 SaxParseException 未提供元素名称

java - Android ListView 只显示最新的项目

java - 将数据库中的图像添加到 JTable

输入 URL 时添加字符的 Java Properties 类

sql-server - 如何使用表中的属性创建 XML 节点

java - Spring - 在运行时使用自定义限定符获取 bean

java - 当 Spring Context 中所有 Controller 都准备就绪时,如何触发事件?

java - 无法使用 Java Spring 连接到 MySQL