Ho un progetto di avvio a molla con CrudRepository, un'entità e un controller. Sto fondamentalmente cercando di mantenere un'entità basata sui dati passati al controller.Come disattivare la convalida di sospensione in un progetto di avvio a molla
Per fare ciò, sto usando spring-boot-starter-jpa
. La mia Entità è annotata con annotazioni JSR-303, che sono verificate nel controllore prima del i dati vengono passati al CrudRepository per la persistenza.
metodo di controllo:
@RequestMapping(value = "users", method = { RequestMethod.POST })
public SuccessfulResponse<User> addUser(@Valid @RequestBody User user, BindingResult validation) {
if (validation.hasErrors()) {
throw new ValidationException(validation);
}
User saved = this.users.save(user);
return new SuccessfulResponse<User>(saved);
}
Entity:
@Entity /* JPA */
public class User {
@Id /* JPA */
@Column(name="email_address", nullable=false, length=255) /* JPA */
@UserUnique
private String emailAddress;
}
La causa dei miei problemi è la UserUnique
annotazione. Il suo validatore si presenta così:
public class UserUniqueValidator implements ConstraintValidator<UserUnique, String> {
private UserRepository users;
@Autowired
public UserUniqueValidator(UserRepository users) {
this.users = users;
}
@Override
public void initialize(UserUnique annotation) {}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return users.findOne(value) == null;
}
}
cosa sembra accadere è, la validazione è sempre eseguito due volte. Una volta nel controller tramite l'annotazione @Valid
e una volta quando Hibernate tenta di mantenere l'oggetto. Tuttavia, quando Hibernate cerca di mantenere l'oggetto, getta:
javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`
Questo sembra essere perché il suo non molla-aware e non posso iniettare la dipendenza nel costruttore. Quindi, quello che voglio fare è disabilitare completamente la validazione di Hibernate (come ridondante e già presente nel controller).
Sembra esserci una proprietà denominata javax.persistence.validation.mode
che è possibile impostare su none
. Tuttavia, non posso per la vita di me capire dove impostarlo in una configurazione basata su codice.
Mi rendo conto che ci sono domande come JSR-303 dependency injection and Hibernate ma queste sono tutte utilizzando la configurazione xml e la configurazione manuale di parti del livello di persistenza.
Quello che voglio fare è "post-configurare" le parti richieste del livello di persistenza che Spring Boot crea per me perché se definisco il mio allora non sto più sfruttando la configurazione automatica di Spring Boot. Qualcuno può aiutarmi a determinare se 1) questo è possibile e 2) quali parti devo configurare e come?
Grazie!
Aggiungere una proprietà al file 'application.properties'. 'spring.jpa.properties.javax.persistence.validation.mode = none' dovrebbe fare il trucco. –
Ha funzionato perfettamente, grazie. È quello menzionato in qualsiasi documentazione di primavera? –
Come impostare ulteriori proprietà JPA è spiegato nella guida di riferimento. –