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 }
どちらの方法をとるにしても、上記のほかに記述しないといけないコードがあるのでしょうか?
どのようにすればいいのかご教示いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/29 09:07