フロント側を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