Я сделал это следующим образом:
@Entity
public class User extends Model {
@Basic(optional=false) @Column(unique=true) public String name;
public User(String name) {
this.name = name;
create();
}
/** used in registration to find name clash */
public static User findByName(String name) {
return find("name", name).first();
}
}
и затем в контроллере вы делаете что-то вроде:
public static void register(@Required String name) {
if(User.findByName(name)!=null) {
Validation.addError("name", "this name is not available");
}
if (validation.hasErrors()) {
validation.keep();
params.flash();
flash.error("Please correct the form data.");
signup(); // whatever your GET action was
}
User user = new User(name);
login(); // whatever your success action is
}
вы можете сделать это без проверки User.findByName ()и вы получите ConstrainViolationException, но это, конечно, не очень удобно для пользователя.Вы также можете просто попробовать / поймать это исключение.Я предпочитаю это обоим способом, потому что удобен и последовательн в базе данных.