SpringでSuperCSVを使ってファイルを出力するとunable to find getter for fieldというエラーがでる。
こんにちは。
ITエンジニアの鈴木尚です。
Springを使ったシステムでCSVファイルを出力する機能はよくありますが、今回、SuperCSVというライブラリを使って実装していてちょっとハマったので、備忘録として残しておきます。
【現象】
modelから受け取ったデータ(userList)をCSVに出力したくて、以下のようなコードを書いて実行したら、エラーになりました。
// 出力するデータを受け取る。 List<User> userList = (List<User>) model.get("userList"); ICsvBeanWriter csvWriter = new CsvBeanWriter(response.getWriter() , CsvPreference.STANDARD_PREFERENCE); // 出力する項目を設定 String[] Header= {"ユーザID","ユーザ有効期限","パスワード有効期限" }; // Listの内容を出力 for (User user : userList) { csvWriter.write(user, Header); } csvWriter.close();
コンソールに出力されたエラー
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.supercsv.exception.SuperCsvReflectionException: unable to find getter for field user_id1 in class com.hoge.hoge - check that the corresponding nameMapping element matches the field name in the bean context=null
【原因】
出力項目の指定方法が間違っていました。
どうやら、Headerに設定する項目は、Modelで定義した項目と一致していないといけないようです。
こんな感じ↓
String[] Header= {"user_id","user_due_date","pass_update" };
importしたモデル↓
public class User { private String user_id; // ユーザーID private Date user_due_date; // ユーザ有効期限 private String password; // パスワード private Date pass_update; // パスワード有効期限 private int login_miss_times; // ログイン失敗回数 private boolean lock_flg; // ロック状態 private boolean enabled_flg; // 有効フラグ private String insert_user; // 作成者 private Timestamp insert_date; // 作成日時 private String update_user; // 更新者 private Timestamp update_date; // 更新日時 }
【結果】
エラーは解消され、ヘッダーとして”user_id”,”user_due_date”,”pass_update” が出力されました。
確かに、ちゃんと定義したとおりに項目名を指定しないと、どれを出力していいかわかりませんからね。当然といえば当然です。。。
【環境】
Spring Boot 2.3.4
Spring Framework 5.2.4
PostgreSQL 13.0
SuperCSV 2.2
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。