2014-11-05 15 views
11

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!

+3

Aggiungere una proprietà al file 'application.properties'. 'spring.jpa.properties.javax.persistence.validation.mode = none' dovrebbe fare il trucco. –

+0

Ha funzionato perfettamente, grazie. È quello menzionato in qualsiasi documentazione di primavera? –

+0

Come impostare ulteriori proprietà JPA è spiegato nella guida di riferimento. –

risposta

17

Come [M. Deinum] menzionato in un commento sul mio post originale, la soluzione è quella di impostare:

spring.jpa.properties.javax.persistence.validation.mode=none 

Nel file application.properties.

Inoltre, questo comportamento è described here (è facile perdere perché non viene fornito alcun esempio).

Problemi correlati