Spring MVC には次のような問題があります。JSR 303 検証を使用して、Bean のプロパティ (以下の PasswordInfo を参照) が空でも null でもないことを確認します。
また、2 つのパスワードが同一であるというビジネス ロジック ルールもチェックしています。
問題は、文字列フィールド (currentPassword および newPassword) の 1 つが空の場合でも、ビジネス ロジック ルールをチェックするためにコントローラーによってサービス層に渡され、もちろん IllegalArgumentException が発生することです。
ここにPasswordInfo
豆があります:
@RooEquals
@RooJavaBean
public class PasswordInfo {
@NotNull(groups = { ValidationGroups.PasswordModification.class })
@NotEmpty(groups = { ValidationGroups.PasswordModification.class })
private String currentPassword;
@NotNull(groups = { ValidationGroups.PasswordModification.class, ValidationGroups.PasswordReset.class })
@NotEmpty(groups = { ValidationGroups.PasswordModification.class, ValidationGroups.PasswordReset.class })
@Size(min = 6, groups = { ValidationGroups.PasswordModification.class, ValidationGroups.PasswordReset.class })
private String newPassword;
...
関連するコントローラーメソッドは次のとおりです。
@RequestMapping(value = "/preference/password", method = RequestMethod.POST, produces = "text/html")
public String modifyPassword(@ModelAttribute @Validated({ ValidationGroups.PasswordModification.class }) PasswordInfo passwordInfo,
BindingResult bindingResult, Model model, @CurrentMember Member member) {
if (!preferenceService.passwordsMatch(member.getPassword(), passwordInfo.getCurrentPassword())) {
bindingResult.rejectValue("currentPassword", "controller.preference.wrong_current_password");
}
if (bindingResult.hasErrors()) {
model.addAttribute("passwordInfo", passwordInfo);
return "preference/password";
}
preferenceService.modifyPassword(member, passwordInfo.getNewPassword());
return "redirect:/preference/password";
}
関連するサービス層メソッドは次のとおりです。
@Override
public boolean passwordsMatch(String encrypted, String plain) {
if (encrypted == null || encrypted.isEmpty() || plain == null || plain.isEmpty()) {
throw new IllegalArgumentException("One argument is null or empty");
}
return passwordEncoder.matches(plain, encrypted);
}
私の懸念は、次のような別の bindingResults.hasErrors ブロックを配置しないようにすることです。
if (bindingResult.hasErrors()) {
model.addAttribute("passwordInfo", passwordInfo);
return "preference/password";
}
...同じことを繰り返さないように、ビジネス ロジック チェックの前に...
誰でもこの問題のクリーンな解決策を提案できますか?