kazpgmの日記

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

1月12日に、Vectorから、バグ修正と説明追加「Ver1.7(202201050000)」公開OKのメールが来た。

Vectorkaz_javaSpringBootプログラム自動作成◎生成ツール」java ,SpringBoot

のバグ修正「Ver1.7(202201050000)」が公開OKとなった。

修正履歴は以下のようになる。
・1.7(202201050000)
 1.不要箇所の修正
  ■com.kaz01u.demo.DemoSpringKaz01uApplication.javaを修正した。
      public void addResourceHandlers(ResourceHandlerRegistry registry) {
    //ファイルアップロード先を定義する。
    registry
                 .addResourceHandler("/upload/**")
      <<修正前 start>>
                 .addResourceLocations("file:///C:/sts/workspace/demo-spring-kaz01u/upload/")
      <<修正前 end>>
      <<修正後 start>>
                 .addResourceLocations("file:///C:/sts/workspace/demo-spring-kaz01u/upload/");
      <<修正後 end>>
      <<削除 start>>
                 .setCachePeriod(3600)
                 .resourceChain(true)
                 .addResolver(new PathResourceResolver());
      <<削除 end>>

  ■xxxxRegister.htmlを修正した。
  理由:登録画面は検索一覧画面から呼ばれないので、pageを保存する必要がないので、hiddenを削除した。
  <form name="frm" id="frm" th:action="@{/members/admin/xxxx/xxxx}" th:object="${xxxxForm}" method="post" autocomplete="off">
  ・・・
  <<削除 start>>
    <input type="hidden" name="page" th:value="${page}"/>
  <<削除 end>>

  ■xxxxController.javaの"mode=lstMode"と"mode=updMode"を修正する。
  理由:不要なロジック(削除①は、shohinListBackSubメソッドの処理と重複するので。
    削除②は、"mode=lstMode"時は不要なので。)を削除する。
  例:ShohinController.java
  @PostMapping(params="mode=lstMode")
  public String shohinListLstMode(
  ・・・
   this.sessionShohinSrchOrderForm.getSrchOrderForm().setUpdMode("lstMode");
  <<削除① start>>
   shohinListSub(this.sessionShohinSrchForm.getShohinSrchForm(), this.sessionShohinSrchOrderForm.getSrchOrderForm(), model, pageable);
   model.addAttribute("shohinSrchForm", this.sessionShohinSrchForm.getShohinSrchForm());
   model.addAttribute("srchOrderForm", this.sessionShohinSrchOrderForm.getSrchOrderForm());
  <<削除① end>>
   //商品情報リスト一覧表示サブ処理
   shohinListBackSub(model, pageable);
  <<削除② start>>
   //商品情報リスト一覧更新サブ処理
   shohinListUpdSub(model);
  <<削除② end>>
   return "/members/admin/shohin/shohinList";
  }
  ・・・
  @PostMapping(params="mode=updMode")
  public String shohinListUpdMode(
  ・・・
   this.sessionShohinSrchOrderForm.getSrchOrderForm().setUpdMode("updMode");
  <<削除① start>>
   shohinListSub(this.sessionShohinSrchForm.getShohinSrchForm(), this.sessionShohinSrchOrderForm.getSrchOrderForm(), model, pageable);
   model.addAttribute("shohinSrchForm", this.sessionShohinSrchForm.getShohinSrchForm());
   model.addAttribute("srchOrderForm", this.sessionShohinSrchOrderForm.getSrchOrderForm());
  <<削除① end>>
   //商品情報リスト一覧表示サブ処理
   shohinListBackSub(model, pageable);
   //商品情報リスト一覧更新サブ処理
   shohinListUpdSub(model);
   return "/members/admin/shohin/shohinList";
  }

 2.バグ修正
  ■サービスクラスのfindAll()及び、Repositoryクラスを修正した。
  理由:Repository.findAll()は、ソートされていなかった。ので、ソートするように修正した。
  ①各情報管理用サービスクラス 例:BiztypeServiceImpl.java
      <<修正前 start>>
    return biztypeRepository.findAll();
      <<修正前 end>>
      <<修正後 start>>
    return biztypeRepository.findAllByOrderByBiztypeCdAsc();
      <<修正後 end>>
   }
  ②DBエレメント用サービスクラス 例:DbElementsServiceImpl.java
      <<修正前 start>>
    List<Biztype> biztypeList = biztypeRepository.findAll();
      <<修正前 end>>
      <<修正後 start>>
    List<Biztype> biztypeList = biztypeRepository.findAllByOrderByBiztypeCdAsc();
      <<修正後 end>>
   }
  ③Repositoryクラス 例:BiztypeRepository.java
      <<追加 start>>
      public List<Biztype> findAllByOrderByBiztypeCdAsc();
      <<追加 end>>

  ■CsvUtils.javaを修正した。
  理由:「private static final CsvMapper mapper = new CsvMapper();」と定義して
   mapperを使用しているが、そもそもnewしないと使えないオブジェクトを
   「static final」として使うのは危険なので修正する。
  補足:当システムのCSVアップロードファイルはSJISなので、CsvUtils.readSjisメソッドを
   使用している。今回問題としたCsvUtils.readUtf8メソッドは使用していない。
      <<削除 start>>
     private static final CsvMapper mapper = new CsvMapper();
      <<削除 end>>
     public static <T> List<T> readUtf8(Class<T> clazz, InputStream stream) throws IOException {
         CsvSchema schema = mapper.schemaFor(clazz).withHeader().withColumnReordering(true);
      <<追加 start>>
      CsvMapper mapper = new CsvMapper(); 
      <<追加 end>>

  ■DbElementsController.javaを修正する。
  理由:中分類エレメント設定および、小分類エレメント設定で公開区分を見ているが、項目名がOpenkbn固定だったので、テーブル項目名に修正した。
  例:
  <<修正前 start>>
  //公開、非公開に関係なく取得する場合
  if (!(subcategoryRec.getOpenkbn().equals("2") && getAllFlg == false)) {
   map.put(subcategoryRec.getSubcategoryCd(), subcategoryRec.getSubcategoryCd() + ":" + subcategoryRec.getSubcatname());
  }
  ・・・
  //公開、非公開に関係なく取得する場合
  if (!(extracategoryRec.getOpenkbn().equals("2") && getAllFlg == false)) {
   map.put(extracategoryRec.getExtracategoryCd(), extracategoryRec.getExtracategoryCd() + ":" + extracategoryRec.getExcatname());
  }
  <<修正前 end>>
  <<修正後 start>>
  //公開、非公開に関係なく取得する場合
  if (!(subcategoryRec.get■ここをテーブル項目名のキャメルにした■().equals("2") && getAllFlg == false)) {
   map.put(subcategoryRec.getSubcategoryCd(), subcategoryRec.getSubcategoryCd() + ":" + subcategoryRec.getSubcatname());
  }
  ・・・
  //公開、非公開に関係なく取得する場合
  if (!(extracategoryRec.get■ここをテーブル項目名のキャメルにした■().equals("2") && getAllFlg == false)) {
   map.put(extracategoryRec.getExtracategoryCd(), extracategoryRec.getExtracategoryCd() + ":" + extracategoryRec.getExcatname());
  }
  <<修正後 end>>

  ■seqService.getDbSeqメソッドのパラメータの使い方が間違っているので修正する。
  理由:"A+yymmdd":パラメータの設定が間違っている。("A"があるとき、"あり"とする所、"A+yymmdd"とか、"yymmdd"とか設定している)
  現象:購入履歴情報の購入履歴ID(シーケンス(yyyymmdd+数字))だけど、実行結果"A20211124000001"になっている。"A"がついているのがNG。
  例:ShohinController.java
  <<修正前>>
    products = seqService.getDbSeq("shohin", shohinProductsLen, "A+yymmdd", 6);
  <<修正後>>
       products = seqService.getDbSeq("shohin", shohinProductsLen, "あり", 6);

  ■xxxxController.javaのxxxxListUpDwnメソッドを修正する。
  理由:result.hasErrors()の時、shohinListBackSubメソッドを実行せずに画面遷移しているので、shohinListBackSubメソッド実行を追加する。
    そのほか、ListUpDwnメソッド限定(ほかのメソッドの”itemErrorMessages”は削除する修正を入れるので)で、”itemErrorMessages”を"errorMessageForListUpd"に変更することに伴う修正。
  例:ShohinController.java
      <<追加 start>>
   import java.util.Locale;
   import org.springframework.context.MessageSource;
   import org.springframework.validation.ObjectError;
      @Autowired
      MessageSource messageSource;
      <<追加 end>>

      @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) {
           //更新しないリスト一覧画面にする
          this.sessionShohinSrchOrderForm.getSrchOrderForm().setUpdMode("lstMode");
          if (result.hasErrors()) {
      <<修正前 start>>
              model.addAttribute("itemErrorMessages", result.toString());
      <<修正前 end>>
      <<修正後 start>>
             String errorMessages = "";
          for (ObjectError error : result.getAllErrors()) {
              errorMessages += messageSource.getMessage(error, Locale.getDefault());
          }
    model.addAttribute("errorMessageForListUpd", errorMessages);
      <<修正後 end>>
      <<追加 start>>
           //商品情報リスト一覧表示サブ処理
           shohinListBackSub(model, pageable);
      <<追加 end>>
              return "/members/admin/shohin/shohinList";
          } else {

  ■xxxxList.htmlを修正する。それに伴いxxxxController.javaからもitemErrorMessagesを削除しておく。
   理由:html側で、itemErrorMessagesの表示を行うつもりはなかったのだが、削除もれしていたので削除する。
   例:ShohinList.html
   <<削除 start>>
   <th:block th:if="${itemErrorMessages == null}">
   <<削除 end>>
   ・・・
   </form>
   <<削除 start>>
   </th:block>
   <<削除 end>>
   例:ShohinController.java
   ・・・修正内容は省略


 3.よりよくするための修正
  ■DbElementsServiceImpl.javaのgetDbEleAryLrgmidsmlBiztypeメソッド、
   getDbEleAryLrgmidsmlCategoryメソッドの説明を書いていて気付いた。ので、修正する。
   修正する箇所はTODOに書いた。不要なパラメータをやめる修正を行う。
   
   例:ShohinController.javaで使用している箇所の説明文を書いている
   //■--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   //■業種情報を対象に、業種マップをDBエレメントに追加するという処理。
   //■パラメータの意味
   //■getAllFlg=false:非公開は取得しない。なのだけど、公開フラグを持ってないので、公開フラグを選択するロジックはないので、設定値は無視される。
     補足:テーブルに公開フラグがない場合でもgetAllFlgパラメータは存在する。
   //■biztypeCd=null:業種情報全データ取得し、業種マップを作成するので、設定値は無視される。
     TODO、テーブル(ここではbiztype)に子テーブルを持たない場合、この主キー(ここではbiztypeCd)は自動作成しないように改修したい。
   //■biztypeCdFlg=true:業種IDがDBにある時、trueとする。なのだけど、業種情報では全データ取得するので、設定値は無視される。
     TODO、テーブル(ここではbiztype)に子テーブルを持たない場合、この主キーフラグ(ここではbiztypeCdFlg)は自動作成しないように改修したい。
   //■lrgMapKey="biztypeCd":dbELEMENTSに、キー"biztypeCd"で、業種マップ(キー:業種ID、データ:業種ID + ":" +業種名)を登録する。
           dbELEMENTS1 = dbElementsService.getDbEleAryLrgmidsmlBiztype(false, null, true, 
                           "biztypeCd");
           dbELEMENTS.putAll(dbELEMENTS1);
   //■--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   //■大分類情報、中分類情報、小分類情報を対象に、
   //■大分類が選択されていないときは、大分類マップのみ、大分類が選択されてれば、さらに、中分類マップ、
   //■中分類が選択されていればさらに、小分類マップをDBエレメントに追加するという処理。
   //■パラメータの意味
   //■getAllFlg=false:非公開は取得しない。
     補足:テーブルに公開フラグがない場合でもgetAllFlgパラメータは存在する。
   //■categoryCd=null:設定値に関係なく、大分類情報全データ取得し、大分類マップを作成する。nullはまだ大分類が選択されていないということ。
   //■categoryCdFlg=true:categoryCd値がDBにある時、trueとする。categoryCdFlg=trueかつ、
   //■         categoryCdがnull以外の時、中分類情報全データ取得し、中分類マップを作成する。
   //■subcategoryCd=null:中分類を設定する。nullはまだ中分類が選択されていないということ。
   //■subcategoryCdFlg=true:中分類がDBにある時、trueとする。subcategoryCdFlg=trueかつ、
   //■         subcategoryCdがnull以外の時、小分類情報全データ取得し、小分類マップを作成する
   //■extracategoryCd=null:当項目は使用していないので、設定値は無視される。
     TODO、テーブル(ここではextracategory)に子テーブルを持たない場合、この主キー(ここではextracategoryCd)は自動作成しないように改修したい。
   //■extracategoryCdFlg=true:当項目は使用していないので、設定値は無視される。
     TODO、テーブル(ここではextracategory)に子テーブルを持たない場合、この主キーフラグ(ここではextracategoryCdFlg)は自動作成しないように改修したい。
   //■lrgMapKey="categoryCd":dbELEMENTSに、キー"categoryCd"で、大分類マップ(キー:大分類、データ:大分類+ ":" +大分類名)を登録する。
   //■midMapKey="subcategoryCd":dbELEMENTSに、キー"subcategoryCd"で、中分類マップ(キー:中分類、データ:中分類+ ":" +中分類名)を登録する。
   //■smlMapKey="extracategoryCd":dbELEMENTSに、キー"extracategoryCd"で、小分類マップ(キー:小分類、データ:小分類+ ":" +小分類名)を登録する。
          dbELEMENTS1 = dbElementsService.getDbEleAryLrgmidsmlCategory(false, null, true, 
                           null, true, 
                           null, true,
                           "categoryCd", "subcategoryCd", "extracategoryCd");
           dbELEMENTS.putAll(dbELEMENTS1);
   //■--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  ■DbElementsService.javaを修正した。
  理由:コメントが間違っていた。
  <<修正前 start>>
      * @param getAllFlg true:削除されているものは取得する false:削除されているものは取得しない
  <<修正前 end>>
  <<修正後 start>>
      * @param getAllFlg true:非公開も取得する false:非公開は取得しない
  <<修正後 end>>

  ■kaz.jzを修正した。
  理由:変数名及び、コメントが間違っていた。indelkbnだと削除確認だけど、正しくは、公開を確認するものだった。
  <<修正前 start>>
     // indelkbn          : '1'削除を含む、'2'削除を含まない
     indelkbn
  <<修正前 end>>
  <<修正後 start>>
     // inopenkbn          : '1'非公開を含む、'2'非公開を含まない
     inopenkbn
  <<修正後 end>>

  ■DbElementsController.javaを修正した。
  理由:変数名及び、コメントが間違っていた。indelkbnだと削除確認だけど、正しくは、公開を確認するものだった。
  <<修正前 start>>
   * @param indelkbn true:非公開も取得する false:非公開は取得しない
     indelkbn
  <<修正前 end>>
  <<修正後 start>>
   * @param inopenkbn '1'非公開を含む、'2'非公開を含まない
     inopenkbn
  <<修正後 end>>

  ■CustomControllerAdvice.javaを修正する。
  内容:
   ・handleException(Exception e)を、handleException(Throwable e)に変更する。よって、ExceptionとErrorを拾うことになる。
    Error(メモリーオーバーフローなどの、システム重大エラー)を拾うのはシステムのような気がするが、
    拾わないと、「Whitelabel Error Page」スタックトレース画面になってしまうので拾うことにする。
    ・・・これが正しい方法かはちょっとわからない。ほかに、スタックトレースをユーザーに見せない方法があればそれでも良いと思う。
   ・例外をキャッチしないで、このロジックに来た場合、スタックトレースが出ていないため。ここで出す。
  @ExceptionHandler
  public String handleException(Throwable e) {
   log.error("System Error occurred.", e);
  <<追加 start>>
         e.printStackTrace();
  <<追加 end>>
   return "error/error.html";

  ■xxxxController.javaのxxxxListUpdSubメソッドを修正する。
  理由:BeanUtils.copyProperties(同一プロパティ(型名まで同じもの)コピー)に外れたものとして
    属性Longも考えていたが、EntityもFormもLongで自動作成しているので、BeanUtils.copyPropertiesで
    コピーされている。ので余分な処理を削除した。
  余談:もともとLongの項目をFormで使う時、Stringなら、文字を入力しても、例外発生にならないから、
    取り回しが良さそうなので、Formは、Stringにしようと考えていた。
    が、FormもLongのほうが良さそうなので、ツール作成途中でFormもLongにすることにした。
    ということでもともとは、EntityはLong、FormはStringにしようと思っていた。その名残り。
  例:ShohinController.java
   private void shohinListUpdSub(Model model) {
    @SuppressWarnings("unchecked")
    List<Shohin> shohinList = (List<Shohin>)model.getAttribute("shohins");
    ShohinInsUpdListForm shohinInsUpdListForm = new ShohinInsUpdListForm();
    List<ShohinForm> shohinFormList = new LinkedList<ShohinForm>();
    shohinInsUpdListForm.setShohinFormList(shohinFormList);
    int i = 0;
    for (Shohin shohin : shohinList) {
     ShohinForm shohinForm = new ShohinForm();
     //同一プロパティ(型名まで同じもの)コピー
     BeanUtils.copyProperties(shohin, shohinForm);
   <<削除 start>>
     shohinForm.setBiztypeCd(shohin.getBiztypeCd());
   <<削除 end>>