sto usando Primavera di avvio dei dati REST di persistere miei User
entità@HandleBeforeCreate dopo la convalida entità Running in primavera Boot dati REST
@Entity
public class User {
@Id
@GeneratedValue
private long id;
@NotEmpty
private String firstName;
@NotEmpty
private String lastName;
@NotEmpty
private String email;
@Size(min = 5, max = 20)
private String password;
// getters and setters
}
utilizzando il repository:
public interface UserRepository extends CrudRepository<User, Long> {}
Quello che voglio fare è validare gli utenti POST
eD prima:
@Configuration
public class CustomRestConfiguration extends SpringBootRepositoryRestMvcConfiguration {
@Autowired
private Validator validator;
@Override
protected void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
validatingListener.addValidator("beforeCreate", validator);
}
}
e solo successivamente hash della password dell'utente prima di riporla nel DB:
@Component
@RepositoryEventHandler(User.class)
public class UserRepositoryEventHandler {
private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
@HandleBeforeCreate
public void handleUserCreate(User user) {
user.setPassword(passwordEncoder.encode(user.getPassword()));
}
}
Come si è visto, però, la convalida viene eseguita dopo l'hashing della password e di conseguenza non riesce a causa della hashing password di essere troppo lungo.
C'è un modo per indicare a Spring di eseguire prima la convalida e solo dopo aver cancellato la password? So che potrei scrivere un controller da solo e specificare tutto in maniera raffinata, ma preferirei lasciarlo come ultima risorsa.
Quale versione di Spring Boot/Data REST stai usando? Ho appena provato questo nella mia app e quando ho inserito il breakpoint nel gestore di Repo e 'SizeValidatorForCharSequence', quello nel validatore viene colpito prima del gestore, quindi per me funziona come previsto. Sto usando Spring Boot 1.2.5 –
@BohuslavBurghardt Sono su Spring Boot '1.2.6.RELEASE' e gestisce tutte le altre versioni di dipendenza. Non so davvero come mettere un punto di interruzione sul validatore, dato che autowire quello (suppongo) creato da JPA. Succede da qualche parte dietro le quinte. Cercheremo di farlo anche se – Wojtek
@Wojtek, c'è qualche altro hook con il quale posso ottenere il controllo dopo la convalida del bean con successo (prima che rimanga un'entità)? – masT