Spring Bootでバリデーションでunexpected errorになった原因について
仕事で単純な業務アプリケーションを開発してたのですが、バリデーションエラー発生した時にWhitelabel Error Pageになってしまい、ログにも何も出力されずハマった事象になります。
状況
@PostMapping("/input")
String confirm(Model model, @Validated @ModelAttribute CompanySalesCodeEdit companySalesCodeEdit,
@PathVariable CompanyCode companyCode,
BindingResult bindingResult
) {
何も考えずに引数を好きなように並べていました。
そうすると、下記のようなエラーが発生しました。
Bad Request, status=400と出るし、Validation failed for objectなる見慣れるエラーが画面には出るが、ログには特にエラー出力はなく、どハマりしました。
解決方法
引数の順番を変えました。
@ModelAttributeの引数の隣にBindingResultを持ってくること。
@PostMapping("/input")
String confirm(Model model, @Validated @ModelAttribute CompanySalesCodeEdit companySalesCodeEdit,
BindingResult bindingResult,
@PathVariable CompanyCode companyCode
) {
Springのドキュメントにも下記記載がありました。
Example 17.1. Invalid ordering of BindingResult and @ModelAttribute
@RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, Model model, BindingResult result) { … }
Note, that there is a Model
parameter in between Pet
and BindingResult
. To get this working you have to reorder the parameters as follows:
@RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, Model model) { … }
フレームワークの仕様とはいえ、詳細なログが出ないとなかなか原因が見つけづらいですよね。フレームワークのドキュメントって英語が多いので全部読んで実装している人って少ないんだろうな。
システムエンジニアライフ〜其の1
僕は大学の情報学科を卒業した。将来の夢というものはない。
就職活動をするもののやりたいことがないものだから志望動機もままならない。
「やりたいことも見つけられてないのに就職といってもなぁ。。」
そんなことを呟きながら1ヶ月に1社というペースでエントリーをしていた。
情報学科を卒業したので特にやりたいこともないしシステムエンジニアを志望。
周りはせかせかと就職活動に勤しんでいる中、そんなスローペースではなかなか内定をもらえるはずもなく、気づけば秋採用の時期になっていた。
「会社説明会の案内メールが来てるな。こんな会社にエントリーしたっけ。。」
どうやら春頃に一括エントリーでエントリーした1社ようだ。
「特に選考が進んでいる会社もないし、久々に行ってみるか。」
重い腰を上げ、説明会場へ足を運ぶ。どうやら人材系サービスの会社のようだ。
会社説明会というのは事業内容の説明などつまらない話が多いが、この会社の社長はそんなお決まり話ではなく会社説明会とは全く関係ない話をメインでしている。
「なんかちょっと面白いな。」
どうやら会社説明会終了後に希望者は面接を受けられるらしい。
グループ面接みたいだけど何気なく参加してみた。
面接官(女)「弊社の志望動機を教えてください。」
僕「インターネットに興味がありかつ就職活動で苦しんだ私は次は他の誰かのために就職や転職など人と仕事を結ぶお手伝いをやりたいと思ったからです。」
面接官(女)「こじつけじゃない?笑」
僕「いえ、そんなことはないです。」
心の中でお前の顔は覚えたぞと思いつつ、もちろん述べた内容はそれっぽいことを言っただけだ。あながち間違いではない。
本心は倒産リスクを考えた時に事業そのものの需要がなくなるのが一番怖いなと思っていたので、その点人材系は人と仕事が有る限り大丈夫そうだと思っていた。
そんなこんなでいつの間にか最終面接まで進んでいた。
それにしてもこの会社は面接を重視しているようだ。
ここまで来るのに7人と面接をして1人1時間くらい(計7時間くらい)話したぞ。
「最終面接はあの説明会で話してた社長か。結構強面だったな。」
社長と対面する。
面接をしてもらう中で自分自身を誠実だと思うか?また、回答に対して理由は?など回答に困る質問が飛んでくる。そのまま思ったままの本心を語る。
そして最終面接が終わって待機。
ガタガタガタガタ。
地震が起きる。ビルの16階なので意外に揺れるなーと思いつつ、落下物がないかじっと上を向く。
人事担当「キャーー、大丈夫ですかー。」
僕「結構揺れるんですねー。」
ちょっと愛想が悪かったかもしれないと思いつつ、人事担当からもう少々お待ちくださいと言われる。内心はもう帰りたいなーと思い始めてきたところだ。
結果的にその場で内定をもらったので選考に時間がかかっていたようだ。
もちろん快諾した。
だが、職種別採用はやっていないらしくシステムエンジニア志望は加味するが志望通りになるかどうかはわからないらしい。
つづく。
とあるエンジニアのしくじり先生
今日の感謝。
営業さんにデータ抽出を頼まれたが、累計だと実行に時間がかかるので期間指定にさせてくださいとお願いしたらお手間とらせてごめんなさいという低姿勢に感謝。
さて本題ですが、これは私のしくじりです。
入社したての私はまずテストケース作成と検証が主な仕事でした。
いわゆるテスターです。
来る日も来る日もテストケースを作成して検証してバグ報告をして…の毎日。
前回正常に動いていたところがバグになったりすることも多々あり、
毎日同じWEBサイトを閲覧し続けることの苦痛も相まってだんだんストレスになってきました。
なんでシステムエンジニア志望で入社したのにテストばっかりなんだ?
なんでこんなにバグばっかり出るんだ?
プログラマーのレベルが低いんじゃないか?
こんなネガティブな事ばかりが頭に浮かんできます。
でも今になって振り返ってみると、
もっと効率的にテストをしてバグ報告を早くする
よく起きるバグ傾向をまとめてみる
など建設的に考えられればもっと周りから信頼されもっと早く評価されていたのではないかと思います。
そしてテスターからプログラマーに転身します。
やりました!自分の希望どおりのやりたいことです。
が、そんな甘い世界ではありませんでした。
私のプログラミングスキルはjavaのif文、for文など基本構文しか知らない状態です。
WEBサイトを作るにはそれはそれは膨大な知識量が必要とされます。
サーバー?クライアント?
JavaとJavaScriptって何が違うの?
セッションって何?
フレームワークって何?
などなどきりがないほど勉強の日々。
数え切れないほどのトライ&エラーを行い、作りあげたプログラムには数々のバグがテスターによって発見されます。
テスターから見ればなんでこんなバグが出るの?なんだけどプログラマーから見たらなんでそんなところに影響が出るの?なんですよね。
テスターが近づいてくるとまたバグか?となり、だんだんテスターが近くにくるのが怖くなってきます。
この時の私はこう考えていました。
もうプログラムを書きたくない
テスターに戻りたい
マネージャーになりたい
人は辛い状況に陥った時は逃げたい気持ち、
楽しそうに仕事をしている人を見るとうらやましい気持ちが起き
それがやりたいことに変わってしまいます。
つまり置かれている状況・環境によってやりたいことは変わるものです。
仕事には2つのベクトルがあると思います。
「やりたいこと」と「できること」です。
「やりたいこと」は状況・環境で変わる偶然に対して「できること」は必然です。
「できること」を積み上げれば評価されやすいですし、信頼もされます。
信頼されれば「やりたいこと」をさせてもらえるチャンスがもらえます。
だからこそ辛くても「できること」を積み上げることが大事なんだと思います。
「できること」が何もないのに「やりたいこと」をやってもうまくいきません。
うまくいかないから辛くなってまた別の「やりたいこと」が生まれるだけなので「できること」が積み上がらないからです。
結局のところ「できること」ファーストなのではないでしょうか。
WEBブラウザのデザインが同じソースコードなのに違う?
これは私がハマったお話です。
本番環境と検証環境で同じソースコードをアップしているのになぜか比較すると文字が小さかったり、レスポンシブデザインのスタイルが違うのがあたってたりしてました。
最初は気のせいかなーと思ってスルーしてたのですが、同僚も同じ事を言っていたのでどうやら勘違いじゃないぞとなり調べ始めました。
何かアップされているファイルに差分があるんじゃないのか?
削除し忘れのファイル?、編集中のファイルが残っている?と比較してみましたが、差分が見つからず、これはソースコードではなくてサーバ設定の違いじゃないのかと思い始めなかなか骨が折れそうだと感じていました。
で同僚に検証環境と本番環境はどう違う?って尋ねたところ検証環境の方が文字が小さいと彼は言う。
ん?こっちは本番環境の方が文字が小さいんだけど。。
え、何?サーバ側じゃなくてクライアント側の環境の問題?となって半ば諦めが出てきてたところ、同僚が放った一言。
あ、ごめん。ブラウザの片方のタブ、縮小になってたわ。
・
・
・
・
ほんまや。自分もやわ。
何気にブラウザの表示拡大・縮小って気づかずに何かの拍子に変わってる事がありますよね。そしてブラウザの表示拡大・縮小の設定ってキャッシュされてるみたいなのでブラウザ閉じてまた復帰したときも適用されてるんですよね。
Chromeだと下記画像の赤枠のところに表示拡大・縮小の設定のマークが出てるんですけどなかなか気づきにくい。。