2

我正在使用 castor 1.3.3-rc1,我一直对这个问题感到困惑。几次阅读手册,我相信我已经在这里完成了所有工作,但我不断得到:

java.lang.IllegalArgumentException: object is not an instance of declaring class{File: [not available]; line: 4; column: 43}

解组我的 xml 时。

这些是我的java类:

public class ReportConfiguration {
    private List<ColumnMapping> columnMappings;

    // getters and setters omitted
}

public class ColumnMapping {
    private int index;
    private String label;
    private String sumTotal;

    // getters and setters omitted
}

这是我的 xml 数据文件,它将被解组到上面的 java 类中

<reportConfiguration>
    <columnMappings>
        <columnMapping index="0" label="Login"/>
        <columnMapping index="1" label="Group"/>
        <columnMapping index="2" label="Profit" sumTotal="yes"/>
    </columnMappings>
</reportConfiguration>

这是我的脚轮映射文件

<mapping>
    <class name="my.company.ReportConfiguration">
        <map-to xml="reportConfiguration"/>
        <field name="columnMappings" collection="arraylist" type="my.company.ColumnMapping">
            <bind-xml name="columnMappings"/>
        </field>
    </class>

    <class name="my.company.ColumnMapping">
        <map-to xml="columnMapping"/>
        <field name="index" type="integer" required="true">
            <bind-xml name="index" node="attribute"/>
        </field>
        <field name="label" type="string" required="true">
            <bind-xml name="label" node="attribute"/>
        </field>
        <field name="sumTotal" type="string">
            <bind-xml name="sumTotal" node="attribute"/>
        </field>
    </class>
</mapping>

我使用了 Spring OXM,在我的应用程序上下文中创建了一个 org.springframework.oxm.castor.CastorMarshaller 实例,并注入了一个 Unmarshaller 实例作为依赖项。解组时我只是做这样的事情:

ReportConfiguration config = (ReportConfiguration) unmarshaller.unmarshall(new StreamSource(inputStream));

谁能发现我做错了什么/我还能如何调试这个问题?

4

1 回答 1

4

啊其实我找到了答案。我需要container="false"在脚轮映射上提供属性:

<field name="columnMappings" collection="arraylist" type="my.company.ColumnMapping" container="false">
        <bind-xml name="columnMappings"/>
</field>

脚轮手册是这样说的:

container 指示字段是否应该被视为一个容器,即只有它的字段应该被持久化,而不是包含类本身。在这种情况下,容器属性应设置为 true(仅在 Castor XML 中支持)。

我认为默认值是 true ——在这种情况下 castor 希望找到<columnMapping>直接在下面的多个实例<reportConfiguration>,而不是包含在 a<columnMappings>

可能会显示更有用的错误消息。

于 2013-02-14T01:44:33.267 回答