Seasar2 on CSV

OrangeSignal CSV の CsvManager を S2 (Seasar2) で使う場合の dicon 設定例を書いておきます。

まず CSV 形式の設定として CsvConfig を定義します。(O/Rマッパーで言うところのダイアレクト相当のものです)
設定可能な項目については CsvConfig の javadoc をご覧ください。

<component name="csvConfig"
           class="jp.sf.orangesignal.csv.CsvConfig">
 <property name="separator">','</property>
 <property name="quote">'"'</property>
 <property name="escape">'\\'</property>
 <property name="quoteDisabled">false</property>
 <property name="escapeDisabled">false</property>
 <property name="breakString">"\n"</property>
 <property name="nullString">"NULL"</property>
 <property name="ignoreCaseNullString">true</property>
 <property name="ignoreLeadingWhitespaces">true</property>
 <property name="ignoreTrailingWhitespaces">true</property>
 <property name="ignoreEmptyLines">true</property>
 <property name="skipLines">0</property>
 <property name="quotePolicy">
  @jp.sf.orangesignal.csv.QuotePolicy@MINIMAL
 </property>
 <property name="lineSeparator">"\r\n"</property>
</component>

次にお好みの CsvManager 実装を dicon へ定義してやります。
現在、標準で提供している CsvManager の実装は以下の通り。

  • CsvBeanManager

- フィールド名でオブジェクトをマッピングさせるお手軽 CsvManager

  • CsvColumnNameMappingBeanManager

- フィールドと CSV 列名のマップ情報でマッピングさせる CsvManager

  • CsvColumnPositionMappingBeanManager

- フィールドと CSV 列位置のマップ情報でマッピングさせる CsvManager

  • CsvEntityManager

- アノテーションでオブジェクトをマッピングさせるお手軽 CsvManager

こんな感じで dicon へ設定

<component name="csvBeanManager"
 class="jp.sf.orangesignal.csv.manager.CsvBeanManager">
  <arg>csvConfig</arg>
</component>

<component name="csvColumnNameMappingBeanManager"
 class="jp.sf.orangesignal.csv.manager.
CsvColumnNameMappingBeanManager">
  <arg>csvConfig</arg>
</component>

<component name="csvColumnPositionMappingBeanManager"
 class="jp.sf.orangesignal.csv.manager.
CsvColumnPositionMappingBeanManager">
  <arg>csvConfig</arg>
</component>

<component name="csvEntityManager"
 class="jp.sf.orangesignal.csv.manager.CsvEntityManager">
  <arg>csvConfig</arg>
</component>

後は DI したいところで @Resource を使ってはい終了

public EmployeeService {
 @Resource
 CsvEntityManager csvEntityManager;

 List<Employee> findAll() {
  return csvEntityManager
   .load(Employee.class)
   .from(new File("emp.csv"));
 }
}

public EmployeeLogic {
 @Resource
 CsvBeanManager csvBeanManager;

 List<Employee> find() {
  return csvBeanManager
   .load(Employee.class)
   .offset(0)
   .limit(1000)
   .from(new File("emp.csv"));
 }
}

public OrderAction {
 @Resource
 CsvColumnNameMappingBeanManager
  csvColumnNameMappingBeanManager;

 public List<Order> orders;

 @Execute(validator = false)
 public String list() {
  orders = csvColumnNameMappingBeanManager
   .load(Order.class)
 .column("日付","date",new SimpleDateFormat("yyyy/MM/dd"))
 .column("時刻","date",new SimpleDateFormat("HH:mm:ss"))
 .column("名称","name")
 .column("価格","price")
   .offset(0)
   .limit(1000)
   .from(new File("order.csv"));
   return "list.vm";
 }
}

※S2 ファミリには一応 S2CSV ってのがあるのですが、OrangeSignal CSV を使用した場合、app.dicon でのインクルード設定や Creator、Customizer などへの設定が不要なので、余計な事に頭を使う時間を奪われないですむのではないでしょうか?お好みで使ってみてください。