Chapter 29

Controller(csvアップロード)

kazpgm
kazpgm
2022.01.05に更新

自動作成されたControllerを説明する。

例:商品情報管理("/members/admin/shohin/shohin")

controller.admin.ShohinController.java

商品情報csvアップロード初期表示(mode=up_csv)

    //=======================================================
    // csvアップロード
    //=======================================================
    /**
     * shohinUpCsvメソッド
     * 商品情報テーブルアップロード画面表示
     * 商品情報テーブルアップロード画面を表示する
     * 
     * @return "/members/admin/shohin/shohinUpCsv"
     */

・サイドメニューの商品情報アップロードをクリックすると、JavaScriptのsubmitFrm5関数 によりサブミットされます。
・URL:/members/admin/shohin/shohinによりShohinController.javaにマッピングされ、mode=up_csv★up_csv-01により、shohinUpCsvメソッドにマッピングされます。shohinUpCsvメソッドは商品情報 初期データアップロード画面を初期表示します。★up_csv-02

    @PostMapping(params="mode=up_csv")
    public String shohinUpCsv() {

・遷移先として、/resources/templates/members/admin/shohin/shohinUpCsv.html(商品情報 初期データアップロード画面)をテンプレートファイルとする。

        return "/members/admin/shohin/shohinUpCsv";
    }

商品情報csvアップロード処理(mode=up_csv_do)

    /**
     * shohinUpCsvDoメソッド
     * csvファイルをアップロードし、商品情報テーブルに登録する処理
     * アップロードは管理者向けなので、CsvUtils.readにおいて、CsvMapperクラスでパーズし、
     * shohinService.registerにおいて、@Validで項目チェックを行っている。
     * 補足:アップロードする、csvファイルはShift_JISであること。
     * 
     * @param file csvファイルアップロード
     * @param mode モード
     * @param model モデル
     * @return "/members/admin/shohin/shohinUpCsv"
     * @throws Exception 
     */

・登録ボタンを押下すると、JavaScriptの:document.frm.submit()関数 によりサブミットされます。
・URL:/members/admin/shohin/shohinによりShohinController.javaにマッピングされ、mode=up_csv_doにより、shohinUpCsvDoメソッドにマッピングされます。shohinUpCsvDoメソッドは商品情報CSVをDBに登録します。★up_csv_do-01
・商品情報CSVファイルはfileにセットされる。

    @PostMapping(params="mode=up_csv_do")
    public String shohinUpCsvDo(@RequestParam("file") MultipartFile file,

・リクエストパラメータmodeを受け取ります。
・Model:htmlで表示する値を渡すため、引数にModelを指定する。

            @RequestParam("mode") String mode,
            Model model) throws Exception {
        List<ShohinUpload> shohinList;
        try {

・CsvUtils.readSjisメソッド(画面から、CSVファイル(SJIS文字コード)を読み込んでテーブル登録用データリスト作成する。)を実行し、shohinListを作成する。
・パラメータの意味
 ・ShohinUpload.class:商品CSVアップロード用クラス
 ・file.getInputStream():CSVファイル読み込みstream

            shohinList =CsvUtils.readSjis(ShohinUpload.class, file.getInputStream()); //Shift_JISならこれを使う

・処理可能な例外をキャッチしたら、"errorMessage"をmodelアトリビュートに設定し、遷移先として、/resources/templates/members/admin/shohin/shohinUpCsv.html(商品情報csvアップロード画面)をテンプレートファイルとする。

        } catch(CsvMappingException e) {
            model.addAttribute("errorMessage", "CSVファイルのタイトル行(1行目)と2行目以降の項目数を合わせてください。 メッセージ=" + e.getMessage());
            return "/members/admin/shohin/shohinUpCsv";
        } catch (UnrecognizedPropertyException e){
            model.addAttribute("errorMessage", "CSVファイルのタイトル行(1行目)はEntityの項目名(テーブル項目名ではない)にしてください。 メッセージ=" + e.getMessage());
            return "/members/admin/shohin/shohinUpCsv";
        } catch(InvalidFormatException e) {
            model.addAttribute("errorMessage", "CSVファイルに変換できない文字が含まれています。 メッセージ=" + e.getMessage());
            return "/members/admin/shohin/shohinUpCsv";
        } catch(Exception e) {

・処理可能でない例外をキャッチしたら、ログを書いて例外を投げる。画面はシステム共通例外発生画面になる。「システム共通例外発生画面」シート参照
・補足:Throwable.Errorは、ここでキャッチせずに、システム共通例外発生画面で処理している。

            e.printStackTrace();
            log.error("エラーが発生しました", e);
            throw e;
         }      
        try {

・shohinService.registerForShohinUpCsvDoメソッドで、csvデータ値のチェックを行い、DB・商品情報テーブルにshohinListを挿入する。

            shohinService.registerForShohinUpCsvDo(shohinList);

・処理可能な例外(csvデータ値のチェック結果として、単項目チェックエラーまたは、複合項目チェックエラー)をキャッチしたら、"errorMessageList"をmodelアトリビュートに設定し、遷移先として、/resources/templates/members/admin/shohin/shohinUpCsv.html(商品情報csvアップロード画面)をテンプレートファイルとする。

        //単項目チェックエラー(『shohinService.register(@Valid List<ShohinUpload> shohinList)』の@Validが出したエラー)    
        } catch(ConstraintViolationException e) {
            List<String> list = Functions.createErrorMessage(e.getConstraintViolations());
            model.addAttribute("errorMessageList", list);
            return "/members/admin/shohin/shohinUpCsv";
        //複合項目チェックエラー(自力チックで出したエラー)
        } catch(UploadComplexValidException e) {
            List<String> MsgList = Functions.getErrorMsgList(e.getHashMap());
            model.addAttribute("errorMessageList", MsgList);
            return "/members/admin/shohin/shohinUpCsv";
        //その他の更新時エラー
        } catch(Exception e) {

・DB例外発生時はshohinServiceでrollbackされている。例外をキャッチしたら、ログを書いて例外を投げる。画面はシステム共通例外発生画面になる。「システム共通例外発生画面」シート参照
・補足:Throwable.Errorは、ここでキャッチせずに、システム共通例外発生画面で処理している。

            e.printStackTrace();
            log.error("DBエラーが発生しました", e);
            throw e;
         }      

・"successMessage"=”商品情報登録が完了しました”をmodelアトリビュートに設定し、遷移先として、/resources/templates/members/admin/shohin/shohinUpCsv.html(商品情報csvアップロード画面)をテンプレートファイルとする。

        model.addAttribute("successMessage", "商品情報登録が完了しました");
        return "/members/admin/shohin/shohinUpCsv";
    }