使用Smooks (1.4)读取CSV并将它们转换为Person POJO。
CSV由每行逗号分隔的记录组成,每个记录都有管道分隔的字段:
Smith\John小姐,45岁,男的
史密斯,简,43,女性
因此,每一行代表要创建的不同的人。首先是POJO:
public class Person
{
private String lastName;
private String firstName;
private int age;
private boolean isMale;
private List<String> aliases;
}我的问题是别名的List。以下是我的XML配置的重要部分:
<reader class="org.milyn.csv.CSVReader">
<param name="fields">lastName,fristName,age,gender,aliases</param>
<param name="separator">|</param>
<param name="strict">false</param>
</reader>
<core:filterSettings type="SAX"/>
<jb:bean beanId="person" class="net.me.myproject.app.Person" createOnElement="csv-set/csv-record/">
<jb:value property="lastName" data="csv-set/csv-record/lastName"/>
<jb:value property="firstName" data="csv-set/csv-record/firstName"/>
<jb:value property="isMale" data="csv-set/csv-record/gender"/>
<jb:value property="age" data="csv-set/csv-record/age"/>
<jb:wiring property="aliases" beanRefId="aliases"/>
</jb:bean>
<jb:bean beanId="aliases" class="java.util.ArrayList" createOnElement="???">
<jb:wiring beanRefId="alias"/>
</jb:bean>
<jb:bean beanId="alias" class="java.util.String" createOnElement="???">
???
</jb:bean>因此,我感到窒息的地方是为aliases ArrayList以及每个alias字符串配置正确的alias。预先感谢任何人谁能推动我朝着正确的方向!
发布于 2012-01-30 20:04:26
首先,您的CSVReader的“字段”属性将是包含在CSV文件中的所有字段的hodge-podge,而不管它们映射到哪个Person、list或类型。因此,有些字段将是Person属性,而有些字段将是实际上属于单独的aliases bean的别名,后者的类型是java.util.ArrayList<String>。
您的工作是告诉Smooks如何将每个字段映射到相应的bean/list/component/type/etc,这意味着告诉它遇到每个字段时应该做什么。
Smooks不支持这种“动态”字段绑定,您可以让0+ CSV字段映射回ArrayList,该字段本身要么是空的,要么是填充的。必须枚举CSVReader中的每个字段,这意味着有一个具有固定大小的别名的ArrayList。
因此,您必须决定与每个Person关联的别名的最大数量,并在字段列表中说明这些别名:
<reader class="org.milyn.csv.CSVReader">
<param name="fields">lastName,fristName,age,gender,alias1,alias2,alias3</param>
<param name="separator">|</param>
<param name="strict">false</param>
</reader>这意味着每个CSV记录必须有一个可信的价值,你的3个别名。我建议使用“忽略”值,例如"%%%IGNORE%%%“,这样应用程序逻辑就不能删除包含该值的列表项(在Smooks完成转换(即)之后)。
您还可能希望查看Smooks的内置$ignore$令牌,它可能已经完成了这些操作或类似的操作。
在我们可以在完整的代码示例中将所有内容连接在一起之前的最后一部分是简单地接受这样一个可悲的事实,即Smooks没有(或不公开文档)在这种示例中使用List<String>的任何能力。您必须将POJO转换为用于别名的List<StringBuffer>或List<StringBuilder>,这样我们就可以使用名为setterMethod的Smooks-JavaBean value元素属性。
现在总共:
<jb:bean beanId="aliases" class="java.util.ArrayList" createOnElement="csv-set/csv-record">
<jb:wiring beanRefId="alias1"/>
<jb:wiring beanRefId="alias2"/>
<jb:wiring beanRefId="alias3"/>
</jb:bean>
<jb:bean beanId="alias1" class="java.util.StringBuffer" createOnElement="csv-set/csv-record/alias1">
<jb:value data="csv-set/csv-record/alias1" setterMethod="append" />
</jb:bean>
<jb:bean beanId="alias2" class="java.util.StringBuffer" createOnElement="csv-set/csv-record/alias2">
<jb:value data="csv-set/csv-record/alias2" setterMethod="append" />
</jb:bean>
<jb:bean beanId="alias3" class="java.util.StringBuffer" createOnElement="csv-set/csv-record/alias3">
<jb:value data="csv-set/csv-record/alias3" setterMethod="append" />
</jb:bean>因此,每次我们开始解析一个新的csv-record时,我们都会创建一个person bean (正如您的初始代码示例所显示的那样)和一个aliases bean。然后,在解析此记录的过程中,我们将通过Person找到alias1属性和alias3属性。aliasN字段存储在aliases bean中,而其他Person字段存储在person bean中。最后,Smooks知道如何将person和aliases bean“连接”在一起,以创建JavaPerson对象。
发布于 2012-02-02 12:43:31
回答得很好亚当。
在你最后提出的问题上.我还没试过,但是我会的,但是下面这个应该能用.
<jb:bean beanId="aliases" class="java.util.ArrayList" createOnElement="csv-set/csv-record">
<jb:value data="csv-set/csv-record/alias1" decoder="String"/>
<jb:value data="csv-set/csv-record/alias2" decoder="String"/>
<jb:value data="csv-set/csv-record/alias3" decoder="String"/>
</jb:bean>https://stackoverflow.com/questions/9039156
复制相似问题