Iniezione di bean di primavera in un vincolo di validazione di ibernazione

2

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();
    }
}
    
posta ShaggyInjun 20.04.2014 - 20:17
fonte

0 risposte

Leggi altre domande sui tag