kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

フロント側をFlutter(スマホ)Thymeleaf(PC)、バックエンド側SpringBootの自動作成@自動生成ツール作成中

18:35
①昨日の、『商品情報・詳細ボタン押下ー>例外発生』修正した。以下が、現在動いてる画面

②今日は、画像ファイルとPDFファイルのアップロードを含んだ、『使用できる項目』(これらの項目が登録更新できればまず、OKというテーブル定義)情報の登録画面をメインにエラーを洗い出して修正した。こんな感じになっている。
■使用できる項目登録画面で、全項目に値を入れて更新ボタン押下した。




■登録完了した。

■使用できる項目一覧画面で確認した。



③flutter・スマホ側及びSpring・PC側。チェックして直した内容は以下

★スマホ実機・Flutter側

■商品情報一覧画面で詳細ボタン押下時に例外発生
①エラー
======== Exception caught by widgets library =======================================================
The following _TypeError was thrown building ShohinDetail(dirty, state: _ShohinDetailState#02ff3):
type 'Null' is not a subtype of type 'String'

The relevant error-causing widget was: 
  ShohinDetail ShohinDetail:file:///C:/Users/ueki_/AndroidStudioProjects/flutter_app/lib/affairs/shohin/shohin_list.dart:1257:19
When the exception was thrown, this was the stack: 
#0      _ShohinDetailState._makeWidgets (package:flutter_app/affairs/shohin/shohin_detail.dart:100:62)
#1      _ShohinDetailState.build (package:flutter_app/affairs/shohin/shohin_detail.dart:69:21)

理由:
 ・shohin_detail.dartの「_shohinForm.resDetailMapForm["products"]」などが、
  Spring側から_shohinForm.resDetailMapFormがnullで渡ってきているので読めない。

修正対象:Spring側・ひな形。
02_00_TblCommController.txt 修正
	protected Object ■{prg_name}■DetailComm(■{Prg_name}■FForm ■{prg_name}■FForm, 
・・・
		if (flutterFlg) {
<<修正前 start>>
			//同一プロパティ(型名まで同じもの)コピー
			BeanUtils.copyProperties(■{prg_name}■, ■{prg_name}■FForm.get■{Prg_name}■Form());
			model.addAttribute("■{prg_name}■Form", ■{prg_name}■FForm.get■{Prg_name}■Form());
<<修正前 end>>
<<修正後 start>>
			model.addAttribute("■{prg_name}■", ■{prg_name}■);
<<修正後 end>>


■メニュー画面で、業務情報登録ボタン押下時に例外発生
①エラー
======== Exception caught by widgets library =======================================================
The following RangeError was thrown building BiztypeRegisterAmend(dirty, state: _BiztypeRegisterAmendState#41f76):
RangeError (index): Invalid value: Valid value range is empty: 1

The relevant error-causing widget was: 
  BiztypeRegisterAmend BiztypeRegisterAmend:file:///C:/Users/ueki_/AndroidStudioProjects/flutter_app/lib/home.dart:387:25
When the exception was thrown, this was the stack: 
#0      List.[] (dart:core-patch/growable_array.dart:281:36)
#1      _BiztypeRegisterAmendState._makeWidgets.<anonymous closure> (package:flutter_app/affairs/biztype/biztype_register_amend.dart:141:41)

理由:elements.dart・elementsListでdefaultStr=""の時、配列の最初がnullになっているため例外発生
修正対象:flutter側・ひな形。02_00_elements.txt 修正
  static List<List<String>> elementsList(String key, String defaultStr) {
<<修正前 start>>
    List<List<String>> list = [[]];
<<修正前 end>>
<<修正後 start>>
    List<List<String>> list = List<List<String>>.empty(growable: true);
<<修正後 end>>


■商品情報登録画面の業種IDが入力エラーの時、エラーメッセージの表示位置が間違っている
 エラーメッセージは項目入力値の下にする。
修正対象:Flutter側・ひな形。
 hinagata_AmendView_DB_大中分類Ajax含_中プルダウン.txt
 hinagata_AmendView_DB_大中分類Ajax含_大プルダウン.txt
 hinagata_AmendView_DB_大中分類_中プルダウン.txt
 hinagata_AmendView_DB_大中分類_大プルダウン.txt
 hinagata_AmendView_DB_大中小分類Ajax含_中プルダウン.txt
 hinagata_AmendView_DB_大中小分類Ajax含_大プルダウン.txt
 hinagata_AmendView_DB_大中小分類Ajax含_小プルダウン.txt
 hinagata_AmendView_DB_大中小分類_中プルダウン.txt
 hinagata_AmendView_DB_大中小分類_大プルダウン.txt
 hinagata_AmendView_DB_大中小分類_小プルダウン.txt
 hinagata_AmendView_DB_大分類_大プルダウン.txt
 hinagata_AmendView_プルダウン.txt
 hinagata_ListSrch_DB_大中分類Ajax含_中プルダウン.txt
 hinagata_ListSrch_DB_大中分類Ajax含_大プルダウン.txt
 hinagata_ListSrch_DB_大中分類_中プルダウン.txt
 hinagata_ListSrch_DB_大中分類_大プルダウン.txt
 hinagata_ListSrch_DB_大中小分類Ajax含_中プルダウン.txt
 hinagata_ListSrch_DB_大中小分類Ajax含_大プルダウン.txt
 hinagata_ListSrch_DB_大中小分類Ajax含_小プルダウン.txt
 hinagata_ListSrch_DB_大中小分類_中プルダウン.txt
 hinagata_ListSrch_DB_大中小分類_大プルダウン.txt
 hinagata_ListSrch_DB_大中小分類_小プルダウン.txt
 hinagata_ListSrch_DB_大分類_大プルダウン.txt
 hinagata_ListSrch_プルダウン.txt
「・・・Err==[])?0:1.2,」で検索し、このエラー行がColumn・Widgetの中になければ修正する。
例:
    contentWidgets.add(Container(
      margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
      padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
      decoration: CommUtils.commBoxDecoration(),
<<追加 start>>
      child:Column (
        children: <Widget>[
<<追加 end>>
      //Wrapによって折り返しするが、SizeBox使って左寄せする
<<修正前 start>>
      child: SizedBox(
<<修正前 end>>
<<修正後 start>>
          SizedBox(
<<修正後 end>>
・・・
<<追加 start>>
              ]
            ),
          ),
<<追加 end>>
          Text(
・・・
            style: TextStyle(height:(・・・Err==[])?0:1.2,
・・・
          ),
        ]),
<<削除 start>>
        ),
<<削除 end>>
      ),
    );

■画面入力で、入力エラーの時、エラーメッセージの高さが間違っている
修正対象:Flutter側・ひな形。
 hinagata_AmendView_DB_大中分類Ajax含_中Ajax.txt
 hinagata_AmendView_DB_大中分類Ajax含_中プルダウン.txt
 hinagata_AmendView_DB_大中分類Ajax含_大Ajax.txt
 hinagata_AmendView_DB_大中分類Ajax含_大プルダウン.txt
 hinagata_AmendView_DB_大中分類_中プルダウン.txt
 hinagata_AmendView_DB_大中分類_大プルダウン.txt
 hinagata_AmendView_DB_大中小分類Ajax含_中Ajax.txt
 hinagata_AmendView_DB_大中小分類Ajax含_中プルダウン.txt
 hinagata_AmendView_DB_大中小分類Ajax含_大Ajax.txt
 hinagata_AmendView_DB_大中小分類Ajax含_大プルダウン.txt
 hinagata_AmendView_DB_大中小分類Ajax含_小Ajax.txt
 hinagata_AmendView_DB_大中小分類Ajax含_小プルダウン.txt
 hinagata_AmendView_DB_大中小分類_中プルダウン.txt
 hinagata_AmendView_DB_大中小分類_大プルダウン.txt
 hinagata_AmendView_DB_大中小分類_小プルダウン.txt
 hinagata_AmendView_DB_大分類Ajax含_大Ajax.txt
 hinagata_AmendView_DB_大分類_大プルダウン.txt
 hinagata_AmendView_ファイル.txt
 hinagata_AmendView_プルダウン.txt
 hinagata_AmendView_画像01.txt
 hinagata_AmendView_通常項目date.txt
 hinagata_ListSrch_DB_大中分類Ajax含_中Ajax.txt
 hinagata_ListSrch_DB_大中分類Ajax含_中プルダウン.txt
 hinagata_ListSrch_DB_大中分類Ajax含_大Ajax.txt
 hinagata_ListSrch_DB_大中分類Ajax含_大プルダウン.txt
 hinagata_ListSrch_DB_大中分類_中プルダウン.txt
 hinagata_ListSrch_DB_大中分類_大プルダウン.txt
 hinagata_ListSrch_DB_大中小分類Ajax含_中Ajax.txt
 hinagata_ListSrch_DB_大中小分類Ajax含_中プルダウン.txt
 hinagata_ListSrch_DB_大中小分類Ajax含_大Ajax.txt
 hinagata_ListSrch_DB_大中小分類Ajax含_大プルダウン.txt
 hinagata_ListSrch_DB_大中小分類Ajax含_小Ajax.txt
 hinagata_ListSrch_DB_大中小分類Ajax含_小プルダウン.txt
 hinagata_ListSrch_DB_大中小分類_中プルダウン.txt
 hinagata_ListSrch_DB_大中小分類_大プルダウン.txt
 hinagata_ListSrch_DB_大中小分類_小プルダウン.txt
 hinagata_ListSrch_DB_大分類Ajax含_大Ajax.txt
 hinagata_ListSrch_DB_大分類_大プルダウン.txt
 hinagata_ListSrch_プルダウン.txt
 hinagata_ListSrch_年月日FromTo02.txt
 hinagata_ListSrch_通常項目date.txt
 hinagata_AmendView_ラジオボタン.txt
 hinagata_AmendView_通常項目01.txt
 hinagata_AmendView_郵便番号.txt
 hinagata_ListSrch_チェックボックス.t
 hinagata_ListSrch_ラジオボタン.txt
 hinagata_ListSrch_通常項目01.txt
 hinagata_ListSrch_通常項目FromTo01.t
 hinagata_ListSrch_郵便番号.txt
<<修正前 start>>
style: TextStyle(height:(・・・Err==[])?0:1.2,
<<修正前 end>>
<<修正後 start>>
style: TextStyle(height:(・・・Err.isEmpty)?0:1.2,
<<修正後 end>>
又は
<<修正前 start>>
・・・Err==[]?0:・・・
<<修正前 end>>
<<修正後 start>>
・・・Err.isEmpty?0:・・・
<<修正後 end>>

■検索ボタン押下後、入力エラーの時、Spring側から入力値が戻ってこない。
修正対象:Spring側・ひな形。
02_00_TblCommController.txt 修正
		if (flutterFlg) {
<<修正前 start>>
			// Flutter向け■{TITLE}■検索条件+ソート条件+ページ番号
			model.addAttribute("■{prg_name}■SrchFForm", ■{prg_name}■SrchFForm);
<<修正前 end>>
<<修正後 start>>
			// Flutter向け■{TITLE}■検索条件
			model.addAttribute("■{prg_name}■SrchForm", ■{prg_name}■SrchForm);
<<修正後 end>>

■使用できる項目登録の「検索・入力Ajax(業種ID)」項目が画面に表示されない。
 さらに、この項目が空白に変わったとき、業種名がクリアされていない。
理由:Rowの中身が大きすぎたらしいので、RowをWrapに変更する。
   さらに、この項目が空白に変わったとき、業種名をクリアしていなかった。ので、クリアする。
例:以下は例。inagata_ListSrch・・・では、_■{PRG_NAME}■Formは_■{PRG_NAME}■SrchFormになるので注意
    contentWidgets.add(Container(
      margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
      padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
      decoration: CommUtils.commBoxDecoration(),
        child:Column(
          children: <Widget>[
<<修正前 start>>
            Row (
<<修正前 end>>
<<修正後 start>>
            Wrap (
<<修正後 end>>
              children: <Widget>[
                TextFormField(
・・・
                  onChanged: (value)  async {
<<修正前 start>>
                    if (_■{PRG_NAME}■Form.■{ITEM_NAME}■ != value as ■{StringOrLong}■) {
<<修正前 end>>
<<修正後 start>>
                    if (value.isEmpty) {
                      setState(() {
                        _■{PRG_NAME}■Form.■{ITEM_NAME}■ = "";
                      });
                    } else if (_■{PRG_NAME}■Form.■{ITEM_NAME}■ != value as ■{StringOrLong}■) {
<<修正後 end>>

修正対象:Flutter側・ひな形。
 hinagata_AmendView_DB_大中分類Ajax含_中Ajax.txt(15,19)
 hinagata_AmendView_DB_大中分類Ajax含_大Ajax.txt(15,19)
 hinagata_AmendView_DB_大中小分類Ajax含_中Ajax.txt(15,1
 hinagata_AmendView_DB_大中小分類Ajax含_大Ajax.txt(15,1
 hinagata_AmendView_DB_大中小分類Ajax含_小Ajax.txt(15,1
 hinagata_AmendView_DB_大分類Ajax含_大Ajax.txt(15,19)  
 hinagata_ListSrch_DB_大中分類Ajax含_中Ajax.txt(15,19) 
 hinagata_ListSrch_DB_大中分類Ajax含_大Ajax.txt(15,19) 
 hinagata_ListSrch_DB_大中小分類Ajax含_中Ajax.txt(15,19
 hinagata_ListSrch_DB_大中小分類Ajax含_大Ajax.txt(15,19
 hinagata_ListSrch_DB_大中小分類Ajax含_小Ajax.txt(15,19
 hinagata_ListSrch_DB_大分類Ajax含_大Ajax.txt(15,19)  [

■使用できる項目登録の登録ボタン押下でSpring側例外は発生
Spring側例外
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=dart-http-boundary-GQhJwYhOsjLLVshMDyODeojY4Eqa.aJ7iz4ckJazb3WwtSpFtqp;charset=UTF-8' not supported
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:225)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:158)

①修正対象:Spring側・ひな形
 02_00_TblFlutterController.txt
	@PostMapping("/members/admin/■{prg_name}■/■{prg_name}■■{URL_SUFFIX}■/ins_do")
・・・
<<修正前 start>>
	public Map<String, Object> ■{prg_name}■InsDoFlutter(@RequestBody @Validated(GroupOrder.class) ■{Prg_name}■FForm ■{prg_name}■FForm,
<<修正前 end>>
<<修正後 start>>
	public Map<String, Object> ■{prg_name}■InsDoFlutter(■{RequestBody}■ @Validated(GroupOrder.class) ■{Prg_name}■FForm ■{prg_name}■FForm,
<<修正後 end>>
・・・
	@PostMapping("/members/admin/■{prg_name}■/■{prg_name}■■{URL_SUFFIX}■/upd_do")
・・・
<<修正前 start>>
	public  Map<String, Object> ■{prg_name}■UpdDoFlutter(@RequestBody @Validated(GroupOrder.class) ■{Prg_name}■FForm ■{prg_name}■FForm,
<<修正前 end>>
<<修正後 start>>
	public  Map<String, Object> ■{prg_name}■UpdDoFlutter(■{RequestBody}■ @Validated(GroupOrder.class) ■{Prg_name}■FForm ■{prg_name}■FForm,
<<修正後 end>>

②修正対象:Vb.netのController作成.vb
        変更内容Array(81, 2) = A02_19_04_PrmKeyItmValsForFlutterWK
<<追加 start>>
        If 画像項目ファイル項目あり()  = True then
            変更内容Array(82, 2) = ""
        Else
            変更内容Array(82, 2) = "@RequestBody"
        End If
<<追加 end>>

■使用できる項目登録の登録ボタン押下でSpring側例外発生
Spring側例外:「年月日[yyyy/mm/dd]」項目でSpring側例外発生
発生例外:
 default message [itemForm.item03]]; default message [Failed to convert property value of type 'java.lang.String' to required type 
 'java.util.Date' for property 'itemForm.item03'; nested exception is org.springframework.core.convert.ConversionFailedException: 
 Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull 
 @org.springframework.format.annotation.DateTimeFormat java.util.Date] for value 'null'; 
 nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [null]], 

①Spring側のチェックが"@DateTimeFormat(pattern = "yyyy/MM/dd")"なので、合わせる必要があるらしい。
ので、例:item_register_amend.dartのhttp.MultipartRequestのrequest.fields設定を修正する。
<<修正前 start>>
        request.fields['itemForm.item03'] = _itemForm.item03.toString();
<<修正前 end>>
<<修正後 start>>
        request.fields['itemForm.item03'] = _itemForm.item03!=null?DateFormat("yyyy/MM/dd").format(_itemForm.item03!):"";
<<修正後 end>>

追加対象:1_05_2_4_requestFields_DateTime部品.txt
<<追加 start>>
        request.fields['■{PRG_NAME}■Form.■{ITEM_NAME}■'] = _■{PRG_NAME}■Form.■{ITEM_NAME}■!=null?DateFormat("yyyy/MM/dd").format(_■{PRG_NAME}■Form.■{ITEM_NAME}■!):"";
<<追加 end>>

修正対象:VB.netのFlutterAmendViewとRegisterView作成.vb
        If 画像項目ファイル項目FLG Then
・・・
            For i = 1 To C_HttpResponseFromStreamCnt1
・・・
                If C_HttpResponseFromStreamItems2(i) = "MULTI" Then
                    requestFilesAndFieldsWK = requestFilesAndFieldsWK & hinagataグループ名指定のhinagata変換(hinagataAffairsFlutter, "1_05_2_1_requestFilesAdd部品.txt", 変更内容Array) & vbCrLf
<<修正前 start>>
                Elseif C_HttpResponseFromStreamItems2(i) = "int" or C_HttpResponseFromStreamItems2(i) = "Datetime" Then
                    requestFilesAndFieldsWK = requestFilesAndFieldsWK & hinagataグループ名指定のhinagata変換(hinagataAffairsFlutter, "1_05_2_3_requestFields_int部品.txt", 変更内容Array) & vbCrLf
<<修正前 end>>
<<修正後 start>>
                Elseif C_HttpResponseFromStreamItems2(i) = "int"  Then
                    requestFilesAndFieldsWK = requestFilesAndFieldsWK & hinagataグループ名指定のhinagata変換(hinagataAffairsFlutter, "1_05_2_3_requestFields_int部品.txt", 変更内容Array) & vbCrLf
                Elseif C_HttpResponseFromStreamItems2(i) = "Datetime" Then
                    requestFilesAndFieldsWK = requestFilesAndFieldsWK & hinagataグループ名指定のhinagata変換(hinagataAffairsFlutter, "1_05_2_4_requestFields_DateTime部品.txt", 変更内容Array) & vbCrLf
 <<修正後 end>>
               Else
                    requestFilesAndFieldsWK = requestFilesAndFieldsWK & hinagataグループ名指定のhinagata変換(hinagataAffairsFlutter, "1_05_2_2_requestFields部品.txt", 変更内容Array) & vbCrLf
                End If
            Next

②Formにある、toJsonは、画像、ファイルを入力する画面の、登録、更新には使用できないことを明示する
修正対象:Flutter側のひな形。
01_00_form.txt
  /// http.postのbodyで使用するJsonデータを返却する
<<追加 start>>
  /// 重要:画像、ファイルを入力する画面の、登録、更新には使用できません。「・・・_register_amend.dart」ファイル内
  ///    「var request = http.MultipartRequest("POST", url);」のrequestに設定してください。
  ///    例:request.fields['itemForm.item03'] = _itemForm.item03!=null?DateFormat("yyyy/MM/dd").format(_itemForm.item03!):"";
<<追加 end>>
  String toJson(String _mode, String _csrf, [int page=1]) {

■2022/06/15に、勉強した成果:『Flutter_JavaSpringプログラム自動作成◎自動生成ツール』をVectorに載せました。Zenn本も書きました。使ってみての感想や間違いの指定や、こうやったほうがいいとかの情報があればメールください。
Vector
www.vector.co.jp
・Zenn本(Flutter_JavaSpringプログラム自動作成)
zenn.dev