我正在使用脚轮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));
谁能发现我做错了什么/我还能如何调试这个问题?
最佳答案
啊,实际上我找到了答案。我需要在Castor映射上提供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>
的多个实例,而不是包含在<columnMappings>
中可能会显示更有用的错误消息。