Ho un metodo di controllo come elencato sotto il cui argomento è annotato con @Valid
per validare PasswordChange
oggetto usando un validatore di Hibernate @Constraint
. Sia PasswordChange
sia un vincolo di esempio sono elencati di seguito. Come puoi vedere, sto iniettando loginDao
all'interno del vincolo. È un anti-modello?
L'altra alternativa che mi viene in mente è di iniettare il daos nell'oggetto PasswordChange
in modo che i valori di login siano disponibili all'interno delle implementazioni di ConstraintValidator<A, V>
. Qualcuno ha affermato che mescolare i dati con la logica aziendale è un anti-modello in primavera.
Qualsiasi suggerimento è benvenuto.
Metodo del controller
@RequestMapping(value = "/passwordChange", method = RequestMethod.POST)
public @ResponseBody PasswordInfo passwordInfo(@RequestBody @Valid PasswordChange passwordChange)
throws PasswordChangeException {
return passwordService.changePassword(passwordChange.getLoginKey(), passwordChange.getOldPassword(), passwordChange.getNewPassword());
}
PasswordChange Bean
public class PasswordChange {
@LoginAttemptsExceeded
private String loginKey;
private String oldPassword;
private String newPassword;
@Autowired
private LoginDao loginDao;
private LoginEntity login;
private Person person;
public PasswordChange() {
}
public PasswordChange(String loginKey, String oldPassword, String newPassword) {
this.loginKey = loginKey;
this.oldPassword = oldPassword;
this.newPassword = newPassword;
}
@PostConstruct
public void postInit() {
login = loginDao.findByLogin(loginKey);
person = login.getCorePerson();
}
}
Vincolo di esempio
@Target({ FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = LoginAttemptsExceededValidatorLoginId.class)
@Documented
public @interface LoginAttemptsExceeded {
String message() default "{com.mrll.global.core.constraint.loginAttemptsExceeded}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Validatore dei vincoli di esempio
public final class LoginAttemptsExceededValidatorLoginId implements ConstraintValidator<LoginAttemptsExceeded, String> {
@Resource
private LoginDao loginDao;
private LoginAttemptsExceeded loginAttemptsExceeded;
@Override
public void initialize(final LoginAttemptsExceeded loginAttemptsExceeded) {
this.loginAttemptsExceeded = loginAttemptsExceeded;
}
/**
* Validation fails if the login attempts have exceeded the preset number.
* @param loginId
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(final String loginId, final ConstraintValidatorContext constraintValidatorContext) {
if(StringUtility.IsEmpty(loginId)) return false;
return !loginDao.findByLogin(loginId).isLoginAttemptsExceeded();
}
}