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