2

CSVBeanReader指定されたタイプのBeanを読み取るためのメソッドを公開します。

オブジェクトタイプではなく実際のオブジェクトインスタンスを渡す方法はありますか(つまり、Beanのインスタンス化をカスタマイズするため)?

4

1 に答える 1

1

アップデート:

Super CSV 2.2.0をリリースしました。これにより、CsvBeanReaderCsvDozerBeanReaderの両方が既存のBeanにデータを取り込むことができます。わーい!


私はスーパーCSV開発者です。Super CSVで提供されるリーダー(CsvBeanReaderおよびCsvDozerBeanReader)を使用してこれを行う方法はなく、これまで機能要求として表示されていませんでした。機能リクエストを送信していただければ、次のリリースで追加することを検討します(今月リリースしたいと思っています)。

最も簡単な解決策は、これを可能にする独自のCsvBeanReaderを作成することです。CsvBeanReaderのソースを自分のものにコピーし、必要に応じて変更するだけです。

populateBean()まず、メソッドを2つのメソッドにリファクタリングします(オーバーロードされているため、一方が他方を呼び出します)。

  /**
   * Instantiates the bean (or creates a proxy if it's an interface), and maps the processed columns to the fields of
   * the bean.
   * 
   * @param clazz
   *            the bean class to instantiate (a proxy will be created if an interface is supplied), using the default
   *            (no argument) constructor
   * @param nameMapping
   *            the name mappings
   * @return the populated bean
   * @throws SuperCsvReflectionException
   *             if there was a reflection exception while populating the bean
   */
  private <T> T populateBean(final Class<T> clazz, final String[] nameMapping) {

    // instantiate the bean or proxy
    final T resultBean = instantiateBean(clazz);

    return populateBean(resultBean, nameMapping);
  }

  /**
   * Populates the bean by mapping the processed columns to the fields of the bean.
   * 
   * @param resultBean
   *            the bean to populate
   * @param nameMapping
   *            the name mappings
   * @return the populated bean
   * @throws SuperCsvReflectionException
   *             if there was a reflection exception while populating the bean
   */
  private <T> T populateBean(final T resultBean, final String[] nameMapping) {

    // map each column to its associated field on the bean
    for( int i = 0; i < nameMapping.length; i++ ) {

      final Object fieldValue = processedColumns.get(i);

      // don't call a set-method in the bean if there is no name mapping for the column or no result to store
      if( nameMapping[i] == null || fieldValue == null ) {
        continue;
      }

      // invoke the setter on the bean
      Method setMethod = cache.getSetMethod(resultBean, nameMapping[i], fieldValue.getClass());
      invokeSetter(resultBean, setMethod, fieldValue);

    }

    return resultBean;
  }

次に、(クラスではなく)Beanインスタンスを受け入れる独自のread()メソッド(CsvBeanReaderpopulateBean()のメソッドに基づく)を記述し、インスタンスを受け入れるを呼び出すことができます。

これは演習として残しておきますが、質問がある場合は質問してください:)

于 2013-02-06T09:52:38.033 に答える