質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1105閲覧

SpringBootのエラーメッセージ表示方法

iiinnn

総合スコア8

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/07/19 02:00

編集2021/07/21 07:24

前提・実現したいこと

現在SpringBootの学習に着手したのですが、初歩で転びました。

始めたばかりなのでうまく伝えられないかもしれませんが、
rIdをプライマリキーに登録画面を作成しています。
プライマリキー違反でのエラー画面を表示したいのですが
localhost:8080/にアクセスしてもWhitelabelErrorPage400 となり、望んでいる画面になりません。。

お力添えをどうぞよろしくお願い致します。

エラーメッセージ

There was an unexpected error (type=Bad Request, status=400). Required RForm parameter 'rId' is not present org.springframework.web.bind.MissingServletRequestParameterException: Required RForm parameter 'rId' is not present

SQL

/** プライマリキー違反表示 **/ @Select("SELECT rid FROM TBL_R WHERE rid=#{rId}") List<String> selectSQL02(@Param("rId") String rId); /** 登録 **/ @Insert("INSERT INTO TBL_R (regist_id,regist_name,regist_tel,regist_postalcode,regist_address1, VALUES (#{rId},#{rName},#{rTel},#{rPostal},#{rA1},)") String insertSQL01(@Param("rId") String rId, @Param("rName") String rName, @Param("rTel") String rTel, @Param("rPostal") String rPostal, @Param("rA1") String rA1;

Controller.java

@PostMapping("/viewComplete") public String viewComplete(Model model, ReForm rId) { List<String> list = new ArrayList<String>(); list = service.getId(registId.get_id()); if (list.size() > 0) { model.addAttribute("errMessage", "登録できません。"); return "information/erorr" ; } String regist1 = new String(); result = service.setlist(rId); return "information/complete"; }

Service.java

/** * 情報テーブルに情報の登録 * @return 登録 */ public List<String> getId(String rId) { List<String> result = new ArrayList<String>(); result = sqlMapper.selectSQL09(rId); return result; } public String setList(ReForm reForm) { String result = new String(); result = sqlMapper.insertSQL01( registForm.getRegist_id(), registForm.getRegist_name(), registForm.getRegist_tel(), registForm.getRegist_fax(), registForm.getRegist_representative(), registForm.getRegist_postalcode(), registForm.getRegist_address1(), registForm.getRegist_address2(), registForm.getRegist_address3(), registForm.getRegist_address4()); return result; }

regist.html

<!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>情報登録画面</title> <script src=“https://yubinbango.github..io/yubinbango/yubinbango.js” charset=“UTF-8”></script> </head> <body> <div style="text-align: center"> <h2 style="text-align: center">情報登録</h2> <form th:action="@{/viewComplete}" th:object="${reForm}" method="POST" > <table style="margin: 0 auto"> <tr> <td style="width: 60">ID</td> <td><input type=text size="30" name="re_id"></input></td> </tr> <tr> <td style="width: 60">名前</td> <td><input type=text size="30" name="re_name"></input></td> </tr> <tr> <td style="width: 70">電話番号</td> <td><input type=tel size="30" name="re_tel"></input></td> </tr> <tr> <td style="width: 70">郵便番号</td> <td><input type=text size="30" name="re_postalcode"></input></td> </tr> <tr> <td style="width: 70">住所1</td> <td><input type=text size="30" name="re_address1"></input></td> </tr> <tr> <td colspan=2 style="text-align: center"> <input type="submit" value="登録"></td> </tr> </table> <br><br> <a th:href="@{/viewInformationList}">情報一覧へ戻る</a> </form> </div> </body> </html>

complete.html

<!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>登録完了</title> </head> <body> <div style="text-align: center"> <h2 style="text-align: center">登録完了</h2> <p><a th:href="@{/viewInformationList}">情報一覧へ戻る</a></p> </div> </body> </html>

### ReForm.java

package jp.co.lain.information; @Data public class ReForm { private String re_id; private String re_name; private String re_tel; private String re_postalcode; private String re_address1; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/07/19 02:35

「機械学習」は本件とどう関係するのでしょうか
m.ts10806

2021/07/19 02:37

またSreviseとは? Serviceなら分かるのですが、 一字違えば別のものですので決まっている名前はコピペするくらいの慎重さを持たれたほうがエラーに悩むことも少なくなるのではと
iiinnn

2021/07/19 02:45

ご指摘ありがとうございます。修正いたしました。
m.ts10806

2021/07/19 04:59

Srevice でいいんですね?
iiinnn

2021/07/19 05:33

はい、大丈夫です。
iiinnn

2021/07/21 04:36

解決することができました。コメントしていただきありがとうございました。
m.ts10806

2021/07/21 04:42

せめてSreviceは正しましょうよ。(Serviceなら) あとから見た人が戸惑います
iiinnn

2021/07/21 04:46

修正したのですが、、反映されてないですか?
m.ts10806

2021/07/21 04:53 編集

質問本文よくご確認を。 対応されていたらこんなこといつまでも指摘しません。 Srevice.java ページ内検索したらすぐですよ。目に頼らないこと。
guest

回答1

0

ベストアンサー

ControllerのviewRegistComplete1の引数で以下を指定していますが、これはクライアントからregistIdというキー値で来たリクエストパラメータをこのメソッドの引数にマッピングするというものです

java

1@RequestParam("registId") RegistForm registId

このregistIdはクライアントからは文字列として送ってきているのではないでしょうか?
RegistForm型になっているので受けることができない。もしくは、そもそもregistIdというパラメータが送られてきていないのではないかと思います。

どちらにしても、クライアントサイドのコードをアップしていただくと解決が早くなるかと思います。

投稿2021/07/19 05:10

momotuwo

総合スコア155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iiinnn

2021/07/19 05:41

ご回答ありがとうございます。クライアントコードをアップしました。 仰る通り、registIdは文字列で送っています。 RegistForm型かregistIdか、、コード確認していただけると嬉しいです。
momotuwo

2021/07/19 05:57

記載のコードであれば、メソッドの引数の以下を削除すればいったん動作しないでしょうか? ```java @RequestParam("registId") ``` また、一般にthymeleafでinputタグなどを記述する場合は name属性を直接記載するのではなく、th:fieldを利用することが多いです。 例えば ```html <input type=text size="30" name="regist_address2"></input> ``` ではなく、以下のように記載することが多いです。 以下のように記述すると、RegistFormのregist_address2に紐づくようにname属性(idも)生成してくれます ```html <input type=text size="30" th:field="*{regist_address2}"></input> ```
iiinnn

2021/07/19 06:07

ご丁寧にありがとうございます。 教えていただいた通り@RequestParam("registId")を消したところ エラーの400が500になりました。。 There was an unexpected error (type=Internal Server Error, status=500). nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='registId', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause:
momotuwo

2021/07/19 06:19

エラーから、selectSQL09で落ちていると想定しております。 ※デバッグなどでエラー箇所の確認はお願いいたします。 その場合、投稿時点で記載いただいている > selectSQL09(@Param("registId") RegistForm registId)を > selectSQL09(@Param("registId") String registId)に変えたらいけるのかなと思うのですが を試してみていただけますでしょうか?
iiinnn

2021/07/19 06:35

SQLを訂正したところSreviceでエラーが出てきました。 List<TblCompany> getCheckId(RegistForm registId) {  を List<TblCompany> getCheckId(String registId) { に変えた方が良いのでしょうか。。
momotuwo

2021/07/19 06:51 編集

> SQLを訂正したところSreviceでエラーが出てきました。 どのようなエラーがSerciveのどこで出たのでしょうか? > List<TblCompany> getCheckId(String registId) { > に変えた方が良いのでしょうか。。 エラーが出ている内容とは本質的に関係ないとは思います。 ただし、一般的にStringが引数の方が良いかとは思います。
iiinnn

2021/07/19 06:52

エラー内容を記さず申し訳ありません。 画像貼り付けられたら良いのですができないみたいです。。 Sreviceの result = sqlMapper.selectSQL09(registId); のselectSQL09の下に 型 SQLMapper のメソッド selectSQL09(String) は引数 (RegistForm) に適用できません と表示されました。。 > エラーが出ている内容とは本質的に関係ないとは思います。 > ただし、一般的にStringが引数の方が良いかとは思います。 > (Service層の処理がFormに依存しない処理にできるため。) ご丁寧にありがとうございます。
momotuwo

2021/07/19 06:54

> のselectSQL09の下に > 型 SQLMapper のメソッド selectSQL09(String) は引数 (RegistForm) に適用できません IDE上コンパイルエラーが出たのでしょうか? それであれば、以下SQL部分の引数RegistForm をStringに変更してみてください /** プライマリキー違反表示 **/ @Select("SELECT regist_id FROM TBL_COMPANY WHERE regist_id=#{registId}") List<TblCompany> selectSQL09(@Param("registId") RegistForm registId);
iiinnn

2021/07/19 07:06

> IDE上コンパイルエラーが出たのでしょうか? すみません、私の知識ではわからないです。。 @Select("SELECT regist_id FROM TBL_COMPANY WHERE regist_id=#{registId}") List<TblCompany> selectSQL09(@Param("registId") RegistForm registId); @Select("SELECT regist_id FROM TBL_COMPANY WHERE regist_id=#{registId}") List<TblCompany> selectSQL09(@Param("registId") String registId); 上記の通り、SQLのRegistFormをStringに変更したらSreviceのエラーが発生しました。。
iiinnn

2021/07/19 07:12

> ※デバッグなどでエラー箇所の確認はお願いいたします。 List<TblCompany> list = new ArrayList<TblCompany>(); 確認したところ、Controllerの上記の文までは機能していることがわかりました。
momotuwo

2021/07/19 08:08

念のため確認です。 selectSQL09が2つ記載しているようですが @Select("SELECT regist_id FROM TBL_COMPANY WHERE regist_id=#{registId}") List<TblCompany> selectSQL09(@Param("registId") RegistForm registId); を @Select("SELECT regist_id FROM TBL_COMPANY WHERE regist_id=#{registId}") List<TblCompany> selectSQL09(@Param("registId") String registId); に変更したという認識で間違いないでしょか?
iiinnn

2021/07/19 08:12

はい、間違いないです。
momotuwo

2021/07/19 08:19

Service側の実装は修正されていますでしょうか? > sqlMapper.selectSQL09(registId); ではなく sqlMapper.selectSQL09(registId.getRegistId()); といったようにregistFormからregistIdを取得するように修正する必要があるかと思います。
iiinnn

2021/07/19 08:24

/** プライマリキー違反表示 **/ @Select("SELECT regist_id FROM TBL_COMPANY WHERE regist_id=#{registId}") List<TblCompany> selectSQL09(@Param("registId") String registId); 上記のように訂正いたしました。 public List<TblCompany> getCheckId(RegistForm registId) { public List<TblCompany> getCheckId(String registId) { serviceのエラーを上記のように訂正したところ Controllerの list = service.getCheckId(registId); getCheckIdのところに 型 MainService のメソッド getCheckId(String) は引数 (RegistForm) に適用できません とエラーが表示されました。 Serviceで selectSQL09の引数は(String registId) insertSQL03の引数は(RegistForm registForm) となっているので、 Controllerのpublic String viewRegistComplete1(Model model, RegistForm registId) { ここのRegistForm registIdで引数が違うからエラーなのかなと思いました。。
iiinnn

2021/07/19 08:27

> sqlMapper.selectSQL09(registId.getRegistId()); > といったようにregistFormからregistIdを取得するように修正する必要があるかと思います。 ここはやっていなかったです、、! sqlMapper.selectSQL09(registId.getRegistId()); と訂正したところ メソッド getRegistId() は型 String で未定義です とエラーが表示されてしまいました。。
momotuwo

2021/07/19 08:29

状況理解いたしました。 Controllerの service.getCheckId(registId); を service.getCheckId(registId.getRegistId()); などに変更してみてください。 ※RegistFormクラスにregistIdを取得するためのgetter(取得するメソッド)があることを想定して記載しております。
iiinnn

2021/07/19 08:38

service.getCheckId(registId.getRegist_id()); RegistFormにRegist_idと登録していたので上記のように訂正したところ Controllerのエラーは消えました、、! Service側の実装は修正されていますでしょうか? > > sqlMapper.selectSQL09(registId); > ではなく > sqlMapper.selectSQL09(registId.getRegistId()); > といったようにregistFormからregistIdを取得するように修正する必要があるかと思います。 result = sqlMapper.selectSQL09(registId.getRegist_id()); こちらは訂正してもメソッド getRegist_id() は型 String で未定義ですとエラーが表示されてたままでした。。
momotuwo

2021/07/19 08:41

controller側を修正したのであれば Service側はSeiviceのメソッドの引数がStringになっているため sqlMapper.selectSQL09(registId); のままで大丈夫です。
iiinnn

2021/07/19 08:49

色々とありがとうございます。 訂正したところ、エラーの形が変わりました、、! There was an unexpected error (type=Internal Server Error, status=500). Mapper method 'jp.co.lain.dbUtility.mybatis.SQLMapper.insertSQL03' has an unsupported return type: class java.lang.String org.apache.ibatis.binding.BindingException: Mapper method 'jp.co.lain.dbUtility.mybatis.SQLMapper.insertSQL03' has an unsupported return type: class java.lang.String 残業ができず今日は返信ができなくなってしまうので、今日は失礼いたします。。 何から何までありがとうございました。
momotuwo

2021/07/19 10:33

いくつか対応方法考えられますが 案1 TblCompanyのgetterにsetRegistId()というメソッドがあるでしょうか? ないのであればそれを追加してみてください。 Javaでは変数に対するgetter/setterはgetRegist_idではなくgetRegistId/setRegistIdと定義することが慣例です。 フレームワーク内部で上記を前提に動いている可能性があるためメソッド名を変更するだけで動作する可能性があります 案2 List<TblCompany> selectSQL09 ⇒ List<String> selectSQL09 に変更してください ※Service層および、ControllerのgetCheckIdでList<TblCompany>として定義している箇所も併せて修正
iiinnn

2021/07/20 01:40 編集

> 案1 > TblCompanyのgetterにsetRegistId()というメソッドがあるでしょうか? > ないのであればそれを追加してみてください。 > Javaでは変数に対するgetter/setterはgetRegist_idではなくgetRegistId/setRegistIdと定義することが慣例です。 RegistForm内のregist_idをregistidに変更するということでよろしいでしょうか? > 案2 List<TblCompany> selectSQL09 > ⇒ List<String> selectSQL09 > に変更してください > ※Service層および、ControllerのgetCheckIdでList<TblCompany>として定義している箇所も併せて修正 ありがとうございます。訂正いたしました。 現在エラー表示は出るようになったのですが、登録機能ができなくなってしましました。 Controllerの model.addAttribute("errMessage", "登録できません。"); return "companyInformation/registErorr" ; } String regist1 = new String(); ここまでは作用しているようです。。
momotuwo

2021/07/20 02:15

> RegistForm内のregist_idをregistidに変更するということでよろしいでしょうか? はい。キャメルケースで記載することが多いので、そのようにする方が良いかと思います。 別途修正いただければと思います。 > 現在エラー表示は出るようになったのですが、登録機能ができなくなってしましました。 どのようなエラーが出ているでしょうか?
iiinnn

2021/07/20 02:31

> はい。キャメルケースで記載することが多いので、そのようにする方が良いかと思います。 > 別途修正いただければと思います。 ありがとうございます。修正いたします。 > どのようなエラーが出ているでしょうか? There was an unexpected error (type=Internal Server Error, status=500). Mapper method 'jp.co.lain.dbUtility.mybatis.SQLMapper.insertSQL03' has an unsupported return type: class java.lang.String org.apache.ibatis.binding.BindingException: Mapper method 'jp.co.lain.dbUtility.mybatis.SQLMapper.insertSQL03' has an unsupported return type: class java.lang.String at jp.co.lain.companyInformation.MainService.setRegistList(MainService.java:112) at jp.co.lain.companyInformation.MainController.viewRegistComplete1(MainController.java:137) 上記のように出ています。 (MainController.java:137) regist1 = service.setRegistList(registId); (MainService.java:112)  result = sqlMapper.insertSQL03( が間違えているようです。。 プライマリキー重複違反表示の前はこのコードでも登録機能は使えていたので 型の違いなのかなとは思うのですが。。
momotuwo

2021/07/20 04:28

insert処理をStringで返していることが問題かと思います 一旦雑な修正ですが ①SQLのinsertSQL03をvoidにする ②Serviceの result = sqlMapper.insertSQL03( ~~~~ を、以下のようにresultに格納しないようにし sqlMapper.insertSQL03( ~~~~ setRegistListをvoidにする。もちろんreturnは消す ③Controllerの regist1 = service.setRegistList(registId); を②と同様にregist1を消す service.setRegistList(registId); にしてみてください
iiinnn

2021/07/20 04:52

> ①SQLのinsertSQL03をvoidにする voidを使ったSQLを作ったことがないのですが、 String insertSQL03 void insertSQL03 と直したらよいのでしょうか? > ②Serviceの > result = sqlMapper.insertSQL03( ~~~~ > を、以下のようにresultに格納しないようにし > sqlMapper.insertSQL03( ~~~~ > setRegistListをvoidにする。もちろんreturnは消す public String setRegistList(RegistForm registForm) { public String void (RegistForm registForm) { これに修正する return result; これを消すということでしょうか?
iiinnn

2021/07/20 05:05

void insertSQL03 result =を消去 regist1 =を消去にしたら 正常に作動することができました! 長い時間ご教授いただき大変ありがとうございました。
momotuwo

2021/07/20 05:21

解決したようで良かったです。 良ければ本質問を解決にしておいてください( ^^) _U~~
iiinnn

2021/07/20 05:25

かしこまりました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問