1

Smooks()を使用してCSVを読み取り、それらをPOJO1.4に変換します。Person

CSVは、各行のコンマ区切りのレコードで構成され、各レコードにはパイプで区切られたフィールドがあります。

スミス|ジョン|45|男性|ジョニー|JSmith| JSmizzle、

スミス|ジェーン|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">&#124;</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>

だから私が窒息しているのは、 ArrayListと各文字列をcreateOnElement正しく構成することです。正しい方向に私を動かすことができる人に事前に感謝します!aliasesalias

4

2 に答える 2

4

まず、CSVReader's " fields "属性は、どのPOJO、リスト、またはタイプにマップするかに関係なく、CSVファイル内に含まれるすべてのフィールドの寄せ集めになります。したがって、一部のフィールドはプロパティになり、一部のフィールドは、タイプが別のBeanにPerson実際に属するエイリアスになります。aliasesjava.util.ArrayList<String>

あなたの仕事は、各フィールドをそれぞれのbean / list / component / type / etcにマップする方法をSmooksに指示することです。つまり、各フィールドに遭遇したときに何をすべきかを指示します。

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">&#124;</param>
    <param name="strict">false</param>
</reader>

つまり、各CSVレコードには、3つのエイリアスに対して信頼できる値が必要です。%%%IGNORE%%%アプリロジックがその値を含むリストアイテムを削除できないように、「無視」値を設定することをお勧めします(Smooksが変換の実行を終了した後)。

また、Smooksの組み込み$ignore$トークンを確認することもできます。これは、すでにこれまたはそのようなものを実行している可能性があります。

List<String>完全なコード例ですべてを結び付ける前の最後の部分は、Smooksがこの種の例で使用する機能を持たない(または公に文書化していない)という悲しい事実を単に受け入れることです。POJOをaList<StringBuffer>またはList<StringBuilder>forエイリアスに使用するように変換する必要があります。これにより、。と呼ばれるSmooks-JavaBeanvalue要素属性を利用できるようになりますsetterMethod

完全に今:

<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>

したがって、新しいの解析を開始するたびに、 Bean(最初のコード例が完全に示すように)とBeanのcsv-record両方を作成します。次に、このレコードを解析する過程で、プロパティと同様にを検索します。フィールドはBeanに格納され、他のフィールドはBeanに格納されます。最後に、SmooksはとBeanを「ワイヤリング」してJavaオブジェクトを作成することを知っています。personaliasesPersonalias1alias3aliasNaliasesPersonpersonpersonaliasesPerson

于 2012-01-30T20:04:26.440 に答える
0

いい返事アダム。

あなたが最後に提起したリストの問題について...私はそれを試していませんが、次のことがうまくいくはずですが...

<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>
于 2012-02-02T12:43:31.923 に答える