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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

3186閲覧

編集画面でパスワード未入力の場合はバリデーションエラーが出ないようにしたい

an_yuka09

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/05/28 17:51

Spring Bootで編集画面を作成しています。
編集画面において、パスワードが未入力の場合はそのまま値が保持される(SQL上で値が変更されない)ようにしたく、Controllerクラスに以下のようにコードを記述したのですが、依然として「6~20文字で入力してください」というエラーが出てしまいます。

Controller

1// 方法1 2@Controller 3public class UsersController { 4 @PostMapping("{id}") 5 public String edit(@PathVariable("id") Long id, @Valid @ModelAttribute("editForm") EditForm editForm, BindingResult result, Model model) { 6 7(中略) 8 9 // パスワードが未入力の場合 10 if (editForm.getPassword().equals("") || editForm.getPassword() == null) { 11 if (!editForm.getPassword().matches("^(?=.*[.?/-])[a-zA-Z0-9-/:-@\[-\`\{-\~]{6,20}$")) { 12 model.addAttribute("error", "変更する場合、パスワードは6~20文字の記号を含む半角英数字で入力してください"); 13 editForm.setPassword(editForm.getPassword()); 14 return "users/edit"; 15 } 16 } 17 // バリデーションチェック 18 if (result.hasErrors()) { 19 return "users/edit"; 20 } 21 editService.update(editForm); 22 return "redirect:/users"; 23 }

EditService

1@Service 2public class EditService { 3 4 @Autowired 5 private UserMapper mapper; 6 @Transactional 7 public int update(EditForm editForm) { 8 User entity = new User(); 9 10(中略) 11 12 BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); 13 entity.setPassword(encoder.encode(editForm.getPassword())); 14 15(中略) 16 17 return mapper.update(entity); 18 } 19

そこで下記の動画を参考に、serviceクラスに以下のようにコードを記述し、またcontrollerにてInitBinderで未入力がnullとして返ってくるようにしたのですが、それだとパスワードのみ未入力で更新した場合、更新自体はうまくいってもSQL上でパスワードが「null」となってしまいます。

【参考動画 1:42:32~】
https://www.youtube.com/watch?v=n6s_24Ph944&t=6316s

EditService

1// 方法2 2@Service 3public class EditService { 4 // パスワードが未入力の場合 5 if (form.getPassword() == null && form.getConfirmPass() == null) { 6 BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); 7 entity.setPassword(encoder.encode(form.getPassword())); 8 } 9} 10

Controller

1@InitBinder 2 public void initBinder(WebDataBinder binder) { 3 binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); 4 }

どちらの方法をとるにしても、上記のほかに記述しないといけないコードがあるのでしょうか?
どのようにすればいいのかご教示いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

パスワードが未入力の場合に以下のどちらかの機能と実装すればよいと思います。

  • DBに保存されたパスワードを使って更新する
  • パスワードの更新をしない MyBatis の定義を書く

DBに保存されたパスワードを使う場合

String password = form.getPassword(); if (Objects.isNull(password) && Objects.isNull(form.getConfirmPass())) { User user = mapper.findById(id); // id でUserが取得できるものとして entity.setPassword(user.getPassword()); } else { BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); entity.setPassword(encoder.encode(password)); }

MyBatis の定義を書く場合

xml

1<update id="updateUserWithoutPassword"> 2 UPDATE 3 User 4 SET 5 name = #{name}, 6 // あと何か更新したものがあれば 7 where id = #{id} 8</update>

java

1User entity = new User(); 2user.setId(id); 3user.setName(form.getName()); 4 5String password = form.getPassword(); 6if (Objects.isNull(password) && Objects.isNull(form.getConfirmPass())) { 7 mapper.updateUserWithoutPassword(entity) 8} else { 9 BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); 10 entity.setPassword(encoder.encode(password)); 11 mapper.update(entity) 12}

投稿2021/05/28 19:25

kiino

総合スコア539

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

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

an_yuka09

2021/05/29 09:07

ご丁寧に回答ありがとうございました! こちらを参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問