2013-06-13 7 views
9

Supponiamo di avere un modulo, dove potrei inviare username(@NaturalId) e password per un nuovo utente.Come @Validare il nome utente univoco in primavera?

Vorrei aggiungere utente con username univoco. Come @Valid questo tramite addnotations, e se il nome utente non è uniq visualizzare questo in jsp via <form:error/>?

risposta

2

JSR-303 non supporta ciò che si desidera (qualcosa come un vincolo @Unique). Devi scrivere il tuo validatore. Come può questo essere fatto qui è spiegato: https://community.jboss.org/wiki/AccessingtheHibernateSessionwithinaConstraintValidator

Ma prima di farlo assicuratevi di leggere questa risposta: https://stackoverflow.com/a/3499111/1981720

E questa frase dal precedente articolo:

Il motivo non è @Unique parte dei vincoli built-in è il fatto che l'accesso a Session/EntityManager durante un evento è che apre per le letture di fantastiche fantasmi.

16

AFAIK non c'è un'annotazione per fare questo. Avete due opzioni

Uno, creare un'annotazione del validatore personalizzato. Here è un ottimo esempio. Effettuare una chiamata alla classe DAO e controlla la disponibilità nella realizzazione validatore

public boolean isValid(String object, ConstraintValidatorContext constraintContext) { 

    return userDAO.userNameAvailable(object); //some method to check username availability 
    } 

O

set unico = true sulla vostra proprietà nella classe entità.

@Column(unique = true) 
    private String userName; 

Ma questo non funziona con @valid, invece genera un'eccezione sulla persistenza. Devi usare una logica appropriata per gestirlo.

La prima soluzione non è infallibile. Controlla risposta this su SO.

Il secondo non fallirà mai.

UPDATE

Come Nim Chimpsky commentato, utilizzando sia insieme sarà una soluzione concreta.

+0

Mi consiglia di utilizzare entrambi i metodi – NimChimpsky

+0

Ebbene, dopo aver scavato un po 'sento che la seconda è meglio :) Sarà non fallire mai a differenza del primo. – shazinltc

+0

um, beh, che si affida alla gestione delle eccezioni per quando un utente immette un nome utente preesistente, prima di provare a persistere, devo confermare l'input dell'utente – NimChimpsky

0

È possibile utilizzare UserDetailsService preparato molla classe ed estenderlo e personalizzarlo:

@Service 
public class LoginDetailsServiceImpl implements UserDetailsService, Serializable { 

    @Autowired 
    LoginService loginService; 
    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     if (username == "" || username.isEmpty()) { 
      throw new UsernameNotFoundException(String.format("User %s is invalid!", username)); 
     } 
     Login login = loginService.find(username); 
     if (login == null) { 
      throw new UsernameNotFoundException(String.format("User %s does not exist!", username)); 
     } 
     if (!loginService.scheduleChecking(login.getScheduled())) { 
      throw new UsernameNotFoundException(String.format("User %s is not authorized this time!", username)); 
     } 
     //.... 
Problemi correlati