Chapter 03

Controller・Flutterスマホアプリ対応

kazpgm
kazpgm
2022.06.14に更新

フロント側を、スマホアプリにするためのController

「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと当ツールで作成したプログラムを比較しながら説明します。
比較元の詳細は、Zennの本「SpringBoot、Thymeleaf プログラム自動作成(マクロ使用版)」・「Chapters24:Controller(情報登録)」、「Chapters25:Controller(情報詳細表示)」、「Chapters26:Controller(情報更新)」、「Chapters27:Controller(情報リスト及び、一覧更新、一覧削除)」を見てください。

スマホアプリ追加による修正

スマホアプリからのアクセスの場合、HTMLでなくJSONを戻します。そのための修正を行いました。

■Controllerを比較

(1)①adminはadmincomm(Flutter、PC・WEB共用)とadminpc(PC・WEB用)の、2つになる。かつ、新たに、②adminflutter(Flutter用)が作成される。

・「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと、当ツールで作成したプログラムを比較した

商品情報登録表示処理

Flutterスマホ用。ResData.java(Flutter向けデータマップを返却するクラス)

ResData.java
@Data 

@Dataによりコンストラクタが作られる。

@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ResData {
  private static final long serialVersionUID = 1L;
  private Model model;
  private BindingResult result;
  /**
   * getResDataMapメソッド
   * Flutter向けデータマップを返却する
   * 
   * @param messageSource メッセージソース
   * @param formComm Flutter側formComm
   * @param resFormName Flutter側resForm
   * @param srchFormName Flutter側srchForm
   * @param srchOrdeFormName Flutter側srchOrdeForm
   * @param resDetailMapFormName Flutter側明細情報
   * @param resListFormName Flutter側一覧情報
   * @return Flutter向けデータマップ
   */
  public Map<String, Object> getResDataMap(MessageSource messageSource, FormComm formComm, String resFormName, String srchFormName, String srchOrdeFormName,
        String resDetailMapFormName, String resListFormName) {
 Map<String, Object> map = new HashMap<String, Object>();

modelにはControllerで「model.addAttribute」した値が入っている。

 Map<String, Object> modelMap = this.model.asMap();
 Map<String, Object> pageMap = new HashMap<String, Object>();
 // modelから取得する
 if (modelMap!=null && modelMap.get("page")!=null) {
   // 検索以外はpageのみStingで持っている

検索以外は、model.addAttributeのpageをStringで持っている。

   if (modelMap.get("page") instanceof String) {
  pageMap.put("size", 0);
  pageMap.put("totalPages", 0);
  if (modelMap.get(resFormName)==null) {
    pageMap.put("pageNumber", 0);
  } else {
    if (formComm == null) {
   pageMap.put("pageNumber", 0);
    } else {

検索以外で、formComm!=nullの時、formCommにIntegerでpageを持っている。これは画面上のページ番号なので-1してpageNumberにしている。

   pageMap.put("pageNumber", formComm.getPage()-1);
    }
  }
   } else {

検索の時は、model.addAttributeにPageオブジェクトでpageを持っている。これによりsize、totalPages、pageNumberを設定している。

  pageMap.put("size", ((Page)modelMap.get("page")).getContent().size());
  pageMap.put("totalPages", ((Page)modelMap.get("page")).getTotalPages());
  pageMap.put("pageNumber", ((Page)modelMap.get("page")).getNumber());
   }
 }
 // Flutter側ではFormは全て、"resForm"、"resListForm"で受け取る

pageObj(ページ)を設定

 map.put("pageObj", pageMap);

resDetailMapForm(詳細情報)を設定

 map.put("resDetailMapForm", ObjectUtils.isEmpty(resDetailMapFormName) || modelMap==null || modelMap.get(resDetailMapFormName)==null?null:modelMap.get(resDetailMapFormName));

resListForm(一覧情報)を設定

 map.put("resListForm", ObjectUtils.isEmpty(resListFormName) || modelMap==null || modelMap.get(resListFormName)==null?null:modelMap.get(resListFormName));
 if (formComm == null) {

formComm(共通Form(Flutter用))を設定

   formComm = new FormComm();
   formComm.setPage(0);
   formComm.setMode(modelMap==null || modelMap.get("mode")==null?null:(String)modelMap.get("mode"));
 } else {
   formComm.setMode(modelMap==null || modelMap.get("mode")==null?null:(String)modelMap.get("mode"));
 }
 map.put("formComm", formComm);
 if (resFormName != null) {

resForm(画面情報)を設定

   map.put(resFormName, modelMap==null || modelMap.get(resFormName)==null?null:modelMap.get(resFormName));
 }
 if (srchFormName != null) {

srchForm(検索情報)を設定

   map.put(srchFormName, modelMap==null || modelMap.get(srchFormName)==null?null:modelMap.get(srchFormName));
 }
 if (srchOrdeFormName != null) {

srchOrderForm(検索昇降順情報)を設定

   map.put(srchOrdeFormName, modelMap==null || modelMap.get(srchOrdeFormName)==null?null:modelMap.get(srchOrdeFormName));
 }

itemErrorMessages(項目エラー情報)を設定
errorMessage(エラーメッセージ)を設定
successMessage(成功メッセージ)を設定

 map.put("itemErrorMessages", modelMap==null || modelMap.get("itemErrorMessages")==null?null:modelMap.get("itemErrorMessages"));
 map.put("errorMessage", modelMap==null || modelMap.get("errorMessage")==null?null:modelMap.get("errorMessage"));
 map.put("successMessage", modelMap==null || modelMap.get("successMessage")==null?null:modelMap.get("successMessage"));
 // resultから取得する

resErrorData(resultから取得した項目エラー情報)を設定

 map.put("resErrorData", getAllErrors(messageSource, result));
 return map;
  }

  /**
   * getAllErrorsメソッド
   * Flutter向け項目エラーマップを返却する
   * 
   * @param messageSource メッセージソース
   * @param result BindingResult
   * @return Flutter向け項目エラーマップ
   */
 private MultiValueMap<String, String> getAllErrors(MessageSource messageSource,
        BindingResult result) {
 MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
 if (result == null || !result.hasErrors()) {
   return map;
 }

 for (FieldError error : result.getFieldErrors()) {
   map.add(error.getField(), messageSource.getMessage(
    error.getCode(),error.getArguments(), error.getDefaultMessage(), 
    Locale.getDefault()));
 }
 return map;
 }  
}
PC・WEB用。当ツールで作成したプログラム・例:①adminpc\ShohinPcController.java
ShohinPcController.javaから抜粋
  /**
   * 商品情報登録表示処理(PC・WEB用)
   * 商品情報登録を表示する処理
   *
   * @param mode モード
   * @param model モデル
   * @return 遷移先
   */

PC・WEB側のPostMappingや、パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと同じ。

  @PostMapping(params="mode=ins")
  public String shohinIns(@RequestParam("mode") String mode,
      Model model) {
    shohinInsSub(model);

returnCommメソッド(Flutter、PC・WEB共用)で処理する。PC・WEBとしては、urlとFlutterFlgのみ見ている。その他はnullでOK

    return (String)returnComm("/members/admin/shohin/shohinRegister", model, null, false, null, null, null, null, null, null);
  }
Flutterスマホ用。当ツールで作成したプログラム・例:②adminflutter\ShohinFlutterController.java
ShohinFlutterController.javaから抜粋
  /**
   * 商品情報登録表示処理(Flutter用)
   * 商品情報登録を表示する処理
   *
   * @param model モデル
   * @return jsonデータ
   */
  @SuppressWarnings("unchecked")

Flutter側のPostMappingはmode=insを使わない方法かつ、返却はJSON形式(@ResponseBody)。Mapで返却すると、JSONにしてくれる。

  @PostMapping("/members/admin/shohin/shohin/ins")
  @ResponseBody
  public Map<String, Object> shohinInsFlutter(Model model) {
    shohinInsSub(model);

returnCommメソッド(Flutter、PC・WEB共用)で処理する

    return (Map<String, Object>)returnComm("/members/admin/shohin/shohinRegister", model, null, true, null, "shohinForm", null, null, null, null);
   }

商品情報登録処理

PC・WEB用。当ツールで作成したプログラム・例:①adminpc\ShohinPcController.java
ShohinPcController.javaから抜粋
  /**
   * 商品情報登録処理(PC・WEB用)
   * 商品情報登録する処理
   *
   * @param shohinForm 商品情報登録
   * @param result チェック結果
   * @param mode モード
   * @param model モデル
   * @return 遷移先
   */

PC・WEB側のPostMappingや、パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと同じ。

  @PostMapping(params="mode=ins_do")
  public String shohinInsDo(@Validated({GroupOrder1.class, GroupOrder2.class})  ShohinForm shohinForm,
      BindingResult result,
      @RequestParam("mode") String mode,
      Model model) {

shohinInsDoCommメソッド(Flutter、PC・WEB共用)で処理する。パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムのパラメータ+flutterFlg

    return (String)shohinInsDoComm(shohinForm, result, model, false);
  }
Flutterスマホ用。当ツールで作成したプログラム・例:②adminflutter\ShohinFlutterController.java
ShohinFlutterController.javaから抜粋
  /**
   * 商品情報登録処理(Flutter用)
   * 商品情報登録する処理
   *
   * @param shohinFForm Flutter向け商品情報登録+ページ番号
   * @param result チェック結果
   * @param model モデル
   * @return jsonデータ
   */
  @SuppressWarnings("unchecked")

Flutter側のPostMappingはmode=ins_doを使わない方法かつ、受信は@RequestBody、返却はJSON形式(@ResponseBody)。Mapで返却すると、JSONにしてくれる。
補足:@RequestBodyは1つのFormしか値を入れれない。ので、いろいろ含んだShohinFFormを使っている。

  @PostMapping("/members/admin/shohin/shohin/ins_do")
  @ResponseBody
  public Map<String, Object> shohinInsDoFlutter(@RequestBody @Validated(GroupOrder.class) ShohinFForm shohinFForm,
      BindingResult result,
      Model model) {

shohinInsDoCommメソッド(Flutter、PC・WEB共用)で処理する。

  return (Map<String, Object>)shohinInsDoComm(shohinFForm.getShohinForm(), result, model, true);
  }

商品情報詳細表示処理

PC・WEB用。当ツールで作成したプログラム・例:①adminpc\ShohinPcController.java
ShohinPcController.javaから抜粋
  //=======================================================
  // 商品情報詳細表示
  //=======================================================
  /**
   * 商品情報詳細表示処理(PC・WEB用)
   * 商品情報詳細を表示する処理
   *
   * @param products products
   * @param mode モード
   * @param page page
   * @param model モデル
   * @return 遷移先
   */

PC・WEB側のPostMappingや、パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと同じ。

  @PostMapping(params="mode=detail")
  public String shohinDetail(
      @RequestParam("products") String products,
      @RequestParam("mode") String mode,
      @RequestParam("page") String page,
      Model model) {

shohinDetailCommメソッド(Flutter、PC・WEB共用)で処理する。パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムのmode以外のパラメータ+shohinFForm+flutterFlg

    return (String)shohinDetailComm(null, products, page, model, false);
  }
Flutterスマホ用。当ツールで作成したプログラム・例:②adminflutter\ShohinFlutterController.java
ShohinFlutterController.javaから抜粋
  //=======================================================
  // 商品情報詳細表示
  //=======================================================
  /**
   * 商品情報詳細表示処理(Flutter用)
   * 商品情報詳細を表示する処理
   *
   * @param shohinFForm Flutter向け商品情報登録+ページ番号
   * @param model モデル
   * @return jsonデータ
   */
  @SuppressWarnings("unchecked")

Flutter側のPostMappingはmode=detailを使わない方法かつ、受信は@RequestBody、返却はJSON形式(@ResponseBody)。Mapで返却すると、JSONにしてくれる。
補足:@RequestBodyは1つのFormしか値を入れれない。ので、いろいろ含んだShohinFFormを使っている。

  @PostMapping("/members/admin/shohin/shohin/detail")
  @ResponseBody  
  public  Map<String, Object> shohinDetailFlutter(@RequestBody ShohinFForm shohinFForm,
      Model model) {

shohinDetailCommメソッド(Flutter、PC・WEB共用)で処理する。

    return ( Map<String, Object>)shohinDetailComm(shohinFForm, shohinFForm.getShohinForm().getProducts(), Integer.toString(shohinFForm.getFormComm().getPage()-1), model, true);
  }

商品情報更新表示処理

PC・WEB用。当ツールで作成したプログラム・例:①adminpc\ShohinPcController.java
ShohinPcController.javaから抜粋
  /**
   * 商品情報更新表示処理(PC・WEB用)
   * 商品情報更新を表示する処理
   *
   * @param products products
   * @param mode モード
   * @param page page
   * @param model モデル
   * @return 遷移先
   */

PC・WEB側のPostMappingや、パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと同じ。

@PostMapping(params="mode=upd")
  public String shohinUpd(
      @RequestParam("products") String products,
      @RequestParam("mode") String mode,
      @RequestParam("page") String page,
      Model model) {

shohinUpdCommメソッド(Flutter、PC・WEB共用)で処理する。パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムのmode以外のパラメータ+shohinFForm+flutterFlg

    return (String)shohinUpdComm(null, products, page, model, false);
  }
Flutterスマホ用。当ツールで作成したプログラム・例:②adminflutter\ShohinFlutterController.java
ShohinFlutterController.javaから抜粋
  /**
   * 商品情報更新表示処理(Flutter用)
   * 商品情報更新を表示する処理
   *
   * @param shohinFForm Flutter向け商品情報登録+ページ番号
   * @param model モデル
   * @return jsonデータ
   */
  @SuppressWarnings("unchecked")

Flutter側のPostMappingはmode=updを使わない方法かつ、受信は@RequestBody、返却はJSON形式(@ResponseBody)。Mapで返却すると、JSONにしてくれる。
補足:@RequestBodyは1つのFormしか値を入れれない。ので、いろいろ含んだShohinFFormを使っている。

  @PostMapping("/members/admin/shohin/shohin/upd")
  @ResponseBody  
  public Map<String, Object>  shohinUpdFlutter(@RequestBody ShohinFForm shohinFForm,
      Model model) {

shohinUpdCommメソッド(Flutter、PC・WEB共用)で処理する。

    return (Map<String, Object>)shohinUpdComm(shohinFForm, shohinFForm.getShohinForm().getProducts(), shohinFForm.getFormComm().getPage().toString(), model, true);
  }

商品情報更新処理

PC・WEB用。当ツールで作成したプログラム・例:①adminpc\ShohinPcController.java
ShohinPcController.javaから抜粋
  /**
   * 商品情報更新処理(PC・WEB用)
   * 商品情報更新する処理
   *
   * @param shohinForm 商品情報登録
   * @param result チェック結果
   * @param mode モード
   * @param page page
   * @param model モデル
   * @return 遷移先
   */

PC・WEB側のPostMappingや、パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと同じ。

  @PostMapping(params="mode=upd_do")
  public String shohinUpdDo(@Validated({GroupOrder1.class, GroupOrder2.class})  ShohinForm shohinForm,
      BindingResult result,
      @RequestParam("mode") String mode,
      @RequestParam("page") String page,
      Model model) {

shohinUpdDoCommメソッド(Flutter、PC・WEB共用)で処理する。パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムのmode以外のパラメータ+shohinFForm+flutterFlg

    return (String)shohinUpdDoComm(null, shohinForm, result, page, model, false);
  }
Flutterスマホ用。当ツールで作成したプログラム・例:②adminflutter\ShohinFlutterController.java
ShohinFlutterController.javaから抜粋
  /**
   * 商品情報更新処理(Flutter用)
   * 商品情報更新する処理
   *
   * @param shohinFForm Flutter向け商品情報登録+ページ番号
   * @param result チェック結果
   * @param model モデル
   * @return jsonデータ
   */
  @SuppressWarnings("unchecked")

Flutter側のPostMappingはmode=upd_doを使わない方法かつ、受信は@RequestBody、返却はJSON形式(@ResponseBody)。Mapで返却すると、JSONにしてくれる。
補足:@RequestBodyは1つのFormしか値を入れれない。ので、いろいろ含んだShohinFFormを使っている。

  @PostMapping("/members/admin/shohin/shohin/upd_do")
  @ResponseBody  
  public  Map<String, Object> shohinUpdDoFlutter(@RequestBody @Validated(GroupOrder.class) ShohinFForm shohinFForm,
      BindingResult result,
      Model model) {

shohinUpdDoCommメソッド(Flutter、PC・WEB共用)で処理する。

    return ( Map<String, Object>)shohinUpdDoComm(shohinFForm, shohinFForm.getShohinForm(), result, Integer.toString(shohinFForm.getFormComm().getPage()-1), model, true);
  }

商品情報リスト検索条件表示処理

PC・WEB用。当ツールで作成したプログラム・例:①adminpc\ShohinPcController.java
ShohinPcController.javaから抜粋
  //=======================================================
  // 商品情報リスト及び、一覧更新、一覧削除
  //=======================================================
  /**
   * 商品情報リスト検索条件表示処理(PC・WEB用)
   * 商品情報リスト検索条件を表示する処理
   *
   * @param shohinSrchForm 商品情報リスト検索条件
   * @param srchOrderForm 商品情報リスト昇順降順条件
   * @param mode モード
   * @param model モデル
   * @param pageable ページ
   * @return 遷移先
   */

PC・WEB側のPostMappingや、パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと同じ。

  @PostMapping(params="mode=list")
  public String shohinList(ShohinSrchForm shohinSrchForm,
      SrchOrderForm srchOrderForm,
      @RequestParam("mode") String mode,
      Model model, 
      @PageableDefault(
                  size=pageableDefaultSize
                            ) 
        Pageable pageable) {

shohinListCommメソッド(Flutter、PC・WEB共用)で処理する。パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムのmode以外のパラメータ+shohinSrchFForm+flutterFlg

    return (String)shohinListComm(null, shohinSrchForm, srchOrderForm, model, pageable, false);
  }
Flutterスマホ用。当ツールで作成したプログラム・例:②adminflutter\ShohinFlutterController.java
ShohinFlutterController.javaから抜粋
  //=======================================================
  // 商品情報リスト及び、一覧更新、一覧削除
  //=======================================================
  /**
   * 商品情報リスト検索条件表示処理(Flutter用)
   * 商品情報リスト検索条件を表示する処理
   *
   * @param shohinSrchFForm Flutter向け商品情報リスト検索条件+ソート条件+ページ番号
   * @param model モデル
   * @return jsonデータ
   */
  @SuppressWarnings("unchecked")

Flutter側のPostMappingはmode=listを使わない方法かつ、受信は@RequestBody、返却はJSON形式(@ResponseBody)。Mapで返却すると、JSONにしてくれる。
補足:@RequestBodyは1つのFormしか値を入れれない。ので、いろいろ含んだShohinSrchFFormを使っている。

  @PostMapping("/members/admin/shohin/shohin/list")
  @ResponseBody
  public Map<String, Object> shohinListFlutter(@RequestBody ShohinSrchFForm shohinSrchFForm,
      Model model) {
    int page = ObjectUtils.isEmpty(shohinSrchFForm.getFormComm().getPage())||shohinSrchFForm.getFormComm().getPage()==0?0:shohinSrchFForm.getFormComm().getPage()-1;
      Pageable pageable = PageRequest.of(page, pageableDefaultSize, Sort.unsorted());

shohinListCommメソッド(Flutter、PC・WEB共用)で処理する。

    return (Map<String, Object>)shohinListComm(shohinSrchFForm, shohinSrchFForm.getShohinSrchForm(), shohinSrchFForm.getSrchOrderForm(), model,pageable, true);
  }

商品情報リスト一覧表示処理

PC・WEB用。当ツールで作成したプログラム・例:①adminpc\ShohinPcController.java
ShohinPcController.javaから抜粋
  /**
   * 商品情報リスト一覧表示処理(PC・WEB用)
   * 検索ボタン押下により、商品情報リスト一覧を表示する処理
   * 
   * @param shohinSrchForm 商品情報リスト検索条件
   * @param result チェック結果
   * @param mode モード
   * @param model モデル
   * @param pageable ページ
   * @return 遷移先 
   */

PC・WEB側のPostMappingや、パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと同じ。

  @PostMapping(params="mode=list_do")
  public String shohinListDo(@Validated({GroupOrder1.class, GroupOrder2.class}) ShohinSrchForm shohinSrchForm,
      BindingResult result,
      @RequestParam("mode") String mode,
      Model model,
      @PageableDefault(
            size=pageableDefaultSize
                ) 
      Pageable pageable) {

shohinListDoCommメソッド(Flutter、PC・WEB共用)で処理する。パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムのmode以外のパラメータ+flutterFlg

    return (String)shohinListDoComm(null, shohinSrchForm, result, model, pageable, false);
  }
Flutterスマホ用。当ツールで作成したプログラム・例:②adminflutter\ShohinFlutterController.java
ShohinFlutterController.javaから抜粋
  /**
   * 商品情報リスト一覧表示処理(PC・WEB用)
   * 検索ボタン押下により、商品情報リスト一覧を表示する処理
   * 
   * @param shohinSrchForm 商品情報リスト検索条件
   * @param result チェック結果
   * @param mode モード
   * @param model モデル
   * @param pageable ページ
   * @return 遷移先 
   */

Flutter側のPostMappingはmode=list_doを使わない方法かつ、受信は@RequestBody、返却はJSON形式(@ResponseBody)。Mapで返却すると、JSONにしてくれる。
補足:@RequestBodyは1つのFormしか値を入れれない。ので、ShohinSrchFormを使っている。

  @PostMapping(params="mode=list_do")
  public String shohinListDo(@Validated({GroupOrder1.class, GroupOrder2.class}) ShohinSrchForm shohinSrchForm,
      BindingResult result,
      @RequestParam("mode") String mode,
      Model model,
      @PageableDefault(
            size=pageableDefaultSize
                ) 
      Pageable pageable) {

shohinListDoCommメソッド(Flutter、PC・WEB共用)で処理する。

    return (String)shohinListDoComm(null, shohinSrchForm, result, model, pageable, false);
  }

商品情報リスト一覧リストバック表示処理

PC・WEB用。当ツールで作成したプログラム・例:①adminpc\ShohinPcController.java
ShohinPcController.javaから抜粋
  /**
   * 商品情報リスト一覧表示処理(PC・WEB用)
   * ページリンク押下により、商品情報リスト一覧を表示する処理
   * 
   * @param mode モード
   * @param model モデル
   * @param pageable ページ
   * @return 遷移先 
   */

PC・WEB側のPostMappingや、パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと同じ。

  @PostMapping(params="mode=list_back")
  public String shohinListBack(
      @RequestParam("mode") String mode,
      Model model, 
      @PageableDefault(
                size=pageableDefaultSize
                          ) 
      Pageable pageable) {

shohinListBackCommメソッド(Flutter、PC・WEB共用)で処理する。パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムのmode以外のパラメータ+SrchOrderFForm+flutterFlg

   return (String)shohinListBackComm(null, model, pageable, false);
  }
Flutterスマホ用。当ツールで作成したプログラム・例:②adminflutter\ShohinFlutterController.java
ShohinFlutterController.javaから抜粋
  /**
   * 商品情報リスト一覧表示処理(Flutter用)
   * ページリンク押下により、商品情報リスト一覧を表示する処理
   * 
   * @param srchOrderFForm Flutter向け商品情報ソート条件+ページ番号
   * @param model モデル
   * @return jsonデータ
   */
  @SuppressWarnings("unchecked")

Flutter側のPostMappingはmode=list_backを使わない方法かつ、受信は@RequestBody、返却はJSON形式(@ResponseBody)。Mapで返却すると、JSONにしてくれる。
補足:@RequestBodyは1つのFormしか値を入れれない。ので、いろいろ含んだSrchOrderFFormを使っている。

  @PostMapping("/members/admin/shohin/shohin/list_back")
  @ResponseBody
  public Map<String, Object> shohinListBackFlutter(@RequestBody SrchOrderFForm srchOrderFForm,
      Model model) {
    int page = ObjectUtils.isEmpty(srchOrderFForm.getFormComm().getPage())||srchOrderFForm.getFormComm().getPage()==0?0:srchOrderFForm.getFormComm().getPage()-1;
      Pageable pageable = PageRequest.of(page, pageableDefaultSize, Sort.unsorted());

shohinListBackCommメソッド(Flutter、PC・WEB共用)で処理する。

    return (Map<String, Object>)shohinListBackComm(srchOrderFForm, model, pageable, true);
  }

商品情報リスト一覧ソート順アップダウン表示処理

PC・WEB用。当ツールで作成したプログラム・例:①adminpc\ShohinPcController.java
ShohinPcController.javaから抜粋
  /**
   * 商品情報リスト一覧表示処理(PC・WEB用)
   * テーブル項目リンク押下により、商品情報リスト一覧を表示する処理
   * 
   * @param srchOrderForm 商品情報リスト昇順降順条件
   * @param result チェック結果
   * @param mode モード
   * @param model モデル
   * @param pageable ページ
   * @return 遷移先 
   */

PC・WEB側のPostMappingや、パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと同じ。

  @PostMapping(params="mode=list_up_dwn")
  public String shohinListUpDwn(@Validated SrchOrderForm srchOrderForm,
      BindingResult result,
      @RequestParam("mode") String mode,
      Model model, 
      @PageableDefault(
                size=pageableDefaultSize
                          ) 
      Pageable pageable) {

shohinListUpDwnCommメソッド(Flutter、PC・WEB共用)で処理する。パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムのmode以外のパラメータ+SrchOrderFForm+flutterFlg

    return (String)shohinListUpDwnComm(null, srchOrderForm, result, model, pageable, false);
  }
Flutterスマホ用。当ツールで作成したプログラム・例:②adminflutter\ShohinFlutterController.java
ShohinFlutterController.javaから抜粋
  /**
   * 商品情報リスト一覧表示処理(Flutter用)
   * テーブル項目リンク押下により、商品情報リスト一覧を表示する処理
   * 
   * @param srchOrderFForm Flutter向け商品情報ソート条件+ページ番号
   * @param result チェック結果
   * @param model モデル
   * @return jsonデータ
   */
  @SuppressWarnings("unchecked")

Flutter側のPostMappingはmode=list_up_dwnを使わない方法かつ、受信は@RequestBody、返却はJSON形式(@ResponseBody)。Mapで返却すると、JSONにしてくれる。
補足:@RequestBodyは1つのFormしか値を入れれない。ので、いろいろ含んだSrchOrderFFormを使っている。

  @PostMapping("/members/admin/shohin/shohin/list_up_dwn")
  @ResponseBody
  public Map<String, Object> shohinListUpDwnFlutter(@RequestBody @Validated SrchOrderFForm srchOrderFForm,
      BindingResult result,
      Model model) {
    int page = ObjectUtils.isEmpty(srchOrderFForm.getFormComm().getPage())||srchOrderFForm.getFormComm().getPage()==0?0:srchOrderFForm.getFormComm().getPage()-1;
      Pageable pageable = PageRequest.of(page, pageableDefaultSize, Sort.unsorted());

shohinListUpDwnCommメソッド(Flutter、PC・WEB共用)で処理する。

    return (Map<String, Object>)shohinListUpDwnComm(srchOrderFForm, srchOrderFForm.getSrchOrderForm(), result, model, pageable, true);
  }

商品情報削除処理

PC・WEB用。当ツールで作成したプログラム・例:①adminpc\ShohinPcController.java
ShohinPcController.javaから抜粋
  /**
   * 商品情報削除処理(PC・WEB用)
   * 
   * @param mode モード
   * @param products products
   * @param model モデル
   * @param pageable ページ
   * @return
   */

PC・WEB側のPostMappingや、パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムと同じ。

  @PostMapping(params="mode=del_do")
  public String shohinDelDo(@RequestParam("mode") String mode, 
      @RequestParam("products") String products,
      Model model, 
      @PageableDefault(
            size=pageableDefaultSize
                ) 
      Pageable pageable) {

shohinDelDoCommメソッド(Flutter、PC・WEB共用)で処理する。パラメータは「kaz_javaSpringBootプログラム自動作成◎自動生成」ツールで作成されたプログラムのmode以外のパラメータ+ShohinFForm+flutterFlg

    return (String)shohinDelDoComm(null, products, model, pageable, false);
  }
Flutterスマホ用。当ツールで作成したプログラム・例:②adminflutter\ShohinFlutterController.java
ShohinFlutterController.javaから抜粋
  /**
   * 商品情報削除処理(Flutter用)
   * 
   * @param srchOrderFForm Flutter向け商品情報ソート条件+ページ番号
   * @param model モデル
   * @return jsonデータ
   */
  @SuppressWarnings("unchecked")

Flutter側のPostMappingはmode=del_doを使わない方法かつ、受信は@RequestBody、返却はJSON形式(@ResponseBody)。Mapで返却すると、JSONにしてくれる。
補足:@RequestBodyは1つのFormしか値を入れれない。ので、いろいろ含んだShohinFFormを使っている。

  @PostMapping("/members/admin/shohin/shohin/del_do")
  @ResponseBody
  public Map<String, Object> shohinDelDoFlutter(@RequestBody ShohinFForm shohinFForm,
      Model model) {
    int page = ObjectUtils.isEmpty(shohinFForm.getFormComm().getPage())||shohinFForm.getFormComm().getPage()==0?0:shohinFForm.getFormComm().getPage()-1;
      Pageable pageable = PageRequest.of(page, pageableDefaultSize, Sort.unsorted());

shohinDelDoCommメソッド(Flutter、PC・WEB共用)で処理する。

    return (Map<String, Object>)shohinDelDoComm(shohinFForm, shohinFForm.getShohinForm().getProducts(), model, pageable, true);
  }

(2)③CustomControllerAdviceAdminFlutter.java(スマホ用の例外処理)

CustomControllerAdviceAdminFlutter.java
package com.kaz01u.demo.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.kaz01u.demo.fform.FormComm;
import lombok.extern.slf4j.Slf4j;
/**
 * すべてのコントローラー(Flutter用)に共通する例外処理クラス(ControllerAdviceクラス)
 * 共通例外(”システムに問題が発生しました”)を戻す。
 *
 */

com.kaz01u.demo.controller.admin以下の例外はこのPGMで処理されます。

@ControllerAdvice(basePackages="com.kaz01u.demo.controller.adminflutter")
//log出力用
@Slf4j
public class CustomControllerAdviceAdminFlutter {
  @ResponseBody
  @ExceptionHandler
  public Map<String, Object> handleException(Throwable e) {
    log.error("System Error occurred.", e);
        e.printStackTrace();
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("errorMessage", "システムに問題が発生しました");
    FormComm formComm = new FormComm();
    formComm.setMode("SystemError");
    map.put("formComm", formComm);

Flutter用はMapを返却します。

    return map;
  }
}

(3)④CustomControllerAdviceAdminPc.java(PC用の例外処理)

CustomControllerAdviceAdminPc.java
package com.kaz01u.demo.controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import lombok.extern.slf4j.Slf4j;
/**
 * すべてのコントローラー(PC・WEB用)に共通する例外処理クラス(ControllerAdviceクラス)
 * 共通例外(”システムに問題が発生しました”)を戻す。
 *
 */

com.kaz01u.demo.controller.adminpc以下の例外はこのPGMで処理されます。

@ControllerAdvice(basePackages="com.kaz01u.demo.controller.adminpc")
//log出力用
@Slf4j
public class CustomControllerAdviceAdminPc {
  @ExceptionHandler
  public String handleException(Throwable e) {
    log.error("System Error occurred.", e);
        e.printStackTrace();

PC・WEB用はerror/error.htmlを表示します。

    return "error/error.html";
  }
}